From 4ca11f13e8c6f92d850bf47d5b32eb4835e69492 Mon Sep 17 00:00:00 2001 From: Kyle Robbertze Date: Mon, 26 Nov 2018 14:36:28 +0100 Subject: Import ocaml-duppy_0.8.0-1.debian.tar.xz [dgit import tarball ocaml-duppy 0.8.0-1 ocaml-duppy_0.8.0-1.debian.tar.xz] --- changelog | 167 ++++++++++++++++++++++++++++++++++++++++++ compat | 1 + control | 47 ++++++++++++ copyright | 63 ++++++++++++++++ gbp.conf | 2 + libduppy-ocaml-dev.doc-base | 9 +++ libduppy-ocaml-dev.docs | 2 + libduppy-ocaml-dev.install.in | 4 + libduppy-ocaml.install.in | 1 + rules | 18 +++++ source/format | 1 + watch | 3 + 12 files changed, 318 insertions(+) create mode 100644 changelog create mode 100644 compat create mode 100644 control create mode 100644 copyright create mode 100644 gbp.conf create mode 100644 libduppy-ocaml-dev.doc-base create mode 100644 libduppy-ocaml-dev.docs create mode 100644 libduppy-ocaml-dev.install.in create mode 100644 libduppy-ocaml.install.in create mode 100755 rules create mode 100644 source/format create mode 100644 watch diff --git a/changelog b/changelog new file mode 100644 index 0000000..f0ea4ae --- /dev/null +++ b/changelog @@ -0,0 +1,167 @@ +ocaml-duppy (0.8.0-1) unstable; urgency=medium + + * New upstream version 0.8.0 + * Drop useless build-dep on camlp4 + * Remove copyright attached to deleted files + + -- Kyle Robbertze Mon, 26 Nov 2018 15:36:28 +0200 + +ocaml-duppy (0.7.3-1) unstable; urgency=low + + * New upstream version 0.7.3 + + -- Kyle Robbertze Mon, 17 Sep 2018 08:59:44 +0200 + +ocaml-duppy (0.7.2-1) unstable; urgency=low + + * New upstream version 0.7.2 + * Bump copyright years and add new copyright entries + + -- Kyle Robbertze Mon, 03 Sep 2018 10:07:03 +0200 + +ocaml-duppy (0.7.1-1) unstable; urgency=low + + * New upstream version 0.7.1 + * Bump Standards-Version to 4.2.1 (no change) + + -- Kyle Robbertze Mon, 27 Aug 2018 10:12:59 +0200 + +ocaml-duppy (0.7.0-1) unstable; urgency=medium + + * New upstream version 0.7.0 + * debian/watch: update watch file url + * debian/copyright: use machine-readable format + * debian/control: Add new Uploader + Bump standards version to 4.1.4 + * debian/compat: bump compat version to 10 + * debian/source/format: use quilt patch format + + -- Kyle Robbertze Fri, 04 May 2018 20:20:02 +0200 + +ocaml-duppy (0.5.1-1) unstable; urgency=low + + * New upstream release. + + -- Romain Beauxis Wed, 08 May 2013 18:55:54 -0500 + +ocaml-duppy (0.5.0-1) experimental; urgency=low + + * New upstream release. + * Upload to experimental. + * Bumped standards version to 3.9.4 + + -- Romain Beauxis Mon, 15 Apr 2013 22:31:34 -0500 + +ocaml-duppy (0.4.2-1) unstable; urgency=low + + * New upstream release. + + -- Romain Beauxis Sat, 08 Oct 2011 16:36:11 +0200 + +ocaml-duppy (0.4.1-1) unstable; urgency=low + + * New upstream release. + + -- Romain Beauxis Thu, 04 Aug 2011 21:50:44 -0500 + +ocaml-duppy (0.4.0-1) unstable; urgency=low + + * Uploading upstream 0.4.0 release to unstable. + + -- Romain Beauxis Sun, 26 Jun 2011 19:54:28 -0500 + +ocaml-duppy (0.4.0~20110523+hg644dd3b27614-1) experimental; urgency=low + + * Snapshot from mercurial repository. + + -- Romain Beauxis Mon, 23 May 2011 15:18:45 -0500 + +ocaml-duppy (0.3.2-2) unstable; urgency=low + + * Upload to unstable. + + -- Romain Beauxis Thu, 03 Mar 2011 13:30:12 -0600 + +ocaml-duppy (0.3.2-1) experimental; urgency=low + + * New upstream release. + * Bumped standards version to 3.9.1 + * Upload to experimental now that squeeze is frozen. + + -- Romain Beauxis Thu, 19 Aug 2010 13:43:19 -0500 + +ocaml-duppy (0.3.1-1) unstable; urgency=low + + * New upstream release. + * Bumped standards version to 3.8.3 + * Use new automatic dependency system. + * Added doc-base registration. + + -- Romain Beauxis Wed, 14 Oct 2009 17:41:30 -0500 + +ocaml-duppy (0.3.0-1) unstable; urgency=low + + * New Upstream Version + * Changed section to ocaml. + * Bumped standards version to 3.8.2.0. + * Enable debugging. + + -- Romain Beauxis Thu, 18 Jun 2009 18:22:52 +0200 + +ocaml-duppy (0.2.0-2) unstable; urgency=low + + * Tighten build-dependency on ocaml-pcre. + + -- Samuel Mimram Fri, 27 Feb 2009 09:36:10 +0100 + +ocaml-duppy (0.2.0-1) unstable; urgency=low + + * New Upstream Version. + * Switch packaging to git. + * Use dh-ocaml's predefined variables. + * Update compat to 7. + + -- Samuel Mimram Wed, 25 Feb 2009 18:08:09 +0100 + +ocaml-duppy (0.1.2-1) unstable; urgency=low + + * New upstream release + * Updated standards to 3.8.0 + * Changed maintainer to Debian OCaml Maintainers + * Added libpcre-ocaml-dev to binary dependencies + + -- Romain Beauxis Wed, 25 Jun 2008 15:25:37 +0200 + +ocaml-duppy (0.1.1-1) unstable; urgency=low + + * New upstream release, now installs .cmx file + * Changed maintainer to Debian OCaml Maintainers + + -- Romain Beauxis Tue, 15 Apr 2008 17:40:51 +0100 + +ocaml-duppy (0.1.0-4) unstable; urgency=low + + * Really fix dh_install call + + -- Romain Beauxis Sun, 06 Apr 2008 15:17:43 +0100 + +ocaml-duppy (0.1.0-3) unstable; urgency=low + + * Fixed FTBFS on non native archs due to missing installed files. + + -- Romain Beauxis Thu, 03 Apr 2008 11:03:03 +0100 + +ocaml-duppy (0.1.0-2) unstable; urgency=low + + * Fixed debian/copyright + * Fixed typos in debian/control + + -- Romain Beauxis Thu, 03 Apr 2008 10:09:44 +0100 + +ocaml-duppy (0.1.0-1) unstable; urgency=low + + * Initial release and upload to unstable + Closes: #471053 + + -- Romain Beauxis Sun, 23 Mar 2008 12:57:20 +0100 + diff --git a/compat b/compat new file mode 100644 index 0000000..f599e28 --- /dev/null +++ b/compat @@ -0,0 +1 @@ +10 diff --git a/control b/control new file mode 100644 index 0000000..4b2a83a --- /dev/null +++ b/control @@ -0,0 +1,47 @@ +Source: ocaml-duppy +Section: ocaml +Priority: optional +Maintainer: Debian OCaml Maintainers +Uploaders: Kyle Robbertze , + Samuel Mimram , + Romain Beauxis +Build-Depends: cdbs (>= 0.4.85~), + debhelper (>= 10), + dh-buildinfo, + ocaml-nox, + dh-ocaml (>= 1.1.0), + ocaml-findlib (>= 1.2.4), + libpcre-ocaml-dev (>= 6.0.1-2) +Standards-Version: 4.2.1 +Homepage: http://savonet.sourceforge.net/ +Vcs-Git: https://salsa.debian.org/ocaml-team/ocaml-duppy.git +Vcs-Browser: https://salsa.debian.org/ocaml-team/ocaml-duppy + +Package: libduppy-ocaml +Architecture: any +Depends: ${shlibs:Depends}, ${ocaml:Depends}, ${misc:Depends} +Provides: ${ocaml:Provides} +Description: Advanced scheduler for OCaml (Runtime library) + Duppy is an event scheduler written for OCaml. It allows the user + to execute tasks according to some events on unix sockets, or + a given delay. + . + Several threaded queues can proceed tasks in parallel. Tasks are + processed according to an abstract notion of priority. + . + This package contains only the shared runtime stub libraries. + +Package: libduppy-ocaml-dev +Architecture: any +Depends: ${ocaml:Depends}, ocaml-findlib, ${misc:Depends} +Provides: ${ocaml:Provides} +Description: Advanced scheduler for OCaml (Development package) + Duppy is an event scheduler written for OCaml. It allows the user + to execute tasks according to some events on unix sockets, or + a given delay. + . + Several threaded queues can proceed tasks in parallel. Tasks are + processed according to an abstract notion of priority. + . + This package contains all the development stuff you need to use ocaml-duppy + in your programs. diff --git a/copyright b/copyright new file mode 100644 index 0000000..c9c6c75 --- /dev/null +++ b/copyright @@ -0,0 +1,63 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: ocaml-duppy +Source: https://github.com/savonet/ocaml-duppy + +Files: * +Copyright: 2003-2010 Savonet Team +License: LGPL-2.1+ + +Files: src/* +Copyright: 2003-2010 Savonet Team +License: GPL-2+ + +Files: m4/ocaml.m4 +Copyright: 2009 Richard W.M. Jones + 2009 Stefano Zacchiroli + 2000-2005 Olivier Andrieu + 2000-2005 Jean-Christophe Filliâtre + 2000-2005 Georges Mariano +License: GPL-2+ + +Files: m4/pkg_config.m4 +Copyright: 2005 Scott James Remnant +License: GPL-2+ + +Files: debian/* +Copyright: 2008 Romain Beauxis + 2018 Kyle Robbertze +License: GPL-2+ + +License: LGPL-2.1+ + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation, with linking exceptions; + either version 2.1 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 + Lesser General Public License for more details. + . + You should have received a copy of the GNU Lesser General Public + License along with this program; if not, see . + . + On Debian systems, the complete text of the GNU Lesser General + Public License version 2.1 can be found in "/usr/share/common-licenses/LGPL-2.1". + +License: GPL-2+ + 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 of the License, or + (at your option) any later version. + . + This package 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 . + . + On Debian systems, the complete text of the GNU General + Public License version 2 can be found in "/usr/share/common-licenses/GPL-2". diff --git a/gbp.conf b/gbp.conf new file mode 100644 index 0000000..cec628c --- /dev/null +++ b/gbp.conf @@ -0,0 +1,2 @@ +[DEFAULT] +pristine-tar = True diff --git a/libduppy-ocaml-dev.doc-base b/libduppy-ocaml-dev.doc-base new file mode 100644 index 0000000..c41e594 --- /dev/null +++ b/libduppy-ocaml-dev.doc-base @@ -0,0 +1,9 @@ +Document: libduppy-ocaml-dev +Title: OCaml Duppy module documentation +Author: Romain Beauxis +Abstract: Documentation of the OCaml Duppy module +Section: Programming/OCaml + +Format: HTML +Index: /usr/share/doc/libduppy-ocaml-dev/html/index.html +Files: /usr/share/doc/libduppy-ocaml-dev/html/* diff --git a/libduppy-ocaml-dev.docs b/libduppy-ocaml-dev.docs new file mode 100644 index 0000000..cecaa8e --- /dev/null +++ b/libduppy-ocaml-dev.docs @@ -0,0 +1,2 @@ +README +doc/html diff --git a/libduppy-ocaml-dev.install.in b/libduppy-ocaml-dev.install.in new file mode 100644 index 0000000..371b02b --- /dev/null +++ b/libduppy-ocaml-dev.install.in @@ -0,0 +1,4 @@ +@OCamlStdlibDir@/duppy/META +@OCamlStdlibDir@/duppy/*.a +@OCamlStdlibDir@/duppy/*.cm* +@OCamlStdlibDir@/duppy/*.ml* diff --git a/libduppy-ocaml.install.in b/libduppy-ocaml.install.in new file mode 100644 index 0000000..038f975 --- /dev/null +++ b/libduppy-ocaml.install.in @@ -0,0 +1 @@ +@OCamlStdlibDir@/duppy/dllduppy_stubs.so @OCamlDllDir@ diff --git a/rules b/rules new file mode 100755 index 0000000..148006b --- /dev/null +++ b/rules @@ -0,0 +1,18 @@ +#!/usr/bin/make -f + +include /usr/share/cdbs/1/rules/debhelper.mk +include /usr/share/cdbs/1/class/autotools.mk +include /usr/share/cdbs/1/rules/ocaml.mk + +DESTDIR = $(CURDIR)/debian/tmp/$(OCAML_STDLIB_DIR) +DEB_MAKE_INSTALL_TARGET := install OCAMLFIND_DESTDIR=$(DESTDIR) OCAMLFIND_LDCONF=ignore +DEB_DH_INSTALL_ARGS := --list-missing +DEB_CONFIGURE_EXTRA_FLAGS := --enable-debugging + +build/libduppy-ocaml-dev:: + mkdir -p $(DESTDIR) + make doc + +clean:: + rm -rf Makefile doc config.log config.status src/META examples/Makefile.http \ + examples/Makefile.telnet src/Makefile diff --git a/source/format b/source/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/watch b/watch new file mode 100644 index 0000000..8c42777 --- /dev/null +++ b/watch @@ -0,0 +1,3 @@ +version=4 +opts=filenamemangle=s/.+\/(\d\S+)\/// \ + https://github.com/savonet/ocaml-duppy/releases .*download/\d\S+/ocaml-duppy-(\d\S+).tar.gz -- cgit v1.2.3 From 7457354e76cf1d5c1472a6563bee6355cd01af1b Mon Sep 17 00:00:00 2001 From: Kyle Robbertze Date: Mon, 26 Nov 2018 14:36:28 +0100 Subject: Import ocaml-duppy_0.8.0.orig.tar.gz [dgit import orig ocaml-duppy_0.8.0.orig.tar.gz] --- CHANGES | 117 + COPYING | 504 +++ Makefile.in | 31 + README | 40 + bootstrap | 17 + config.guess | 1480 ++++++++ config.sub | 1801 ++++++++++ configure | 7395 ++++++++++++++++++++++++++++++++++++++++ configure.ac | 65 + examples/Makefile | 12 + examples/Makefile.http.in | 12 + examples/Makefile.telnet.in | 12 + examples/OCamlMakefile | 1154 +++++++ examples/http.ml | 688 ++++ examples/telnet.ml | 181 + install-sh | 518 +++ m4/base_checks.m4 | 175 + m4/cpp_check_class.m4 | 24 + m4/detect_binding.m4 | 186 + m4/ocaml.m4 | 329 ++ m4/ocaml_compilers.m4 | 76 + m4/pkg_config.m4 | 76 + m4/strict_check_tool.m4 | 7 + src/META.in | 10 + src/Makefile.in | 68 + src/OCamlMakefile | 1138 +++++++ src/duppy.ml | 1121 ++++++ src/duppy.mli | 523 +++ src/duppy_secure_transport.ml | 19 + src/duppy_secure_transport.mli | 6 + src/duppy_ssl.ml | 13 + src/duppy_ssl.mli | 2 + src/duppy_stubs.c | 176 + 33 files changed, 17976 insertions(+) create mode 100644 CHANGES create mode 100644 COPYING create mode 100644 Makefile.in create mode 100644 README create mode 100755 bootstrap create mode 100755 config.guess create mode 100755 config.sub create mode 100755 configure create mode 100644 configure.ac create mode 100644 examples/Makefile create mode 100644 examples/Makefile.http.in create mode 100644 examples/Makefile.telnet.in create mode 100644 examples/OCamlMakefile create mode 100644 examples/http.ml create mode 100644 examples/telnet.ml create mode 100755 install-sh create mode 100644 m4/base_checks.m4 create mode 100644 m4/cpp_check_class.m4 create mode 100644 m4/detect_binding.m4 create mode 100644 m4/ocaml.m4 create mode 100644 m4/ocaml_compilers.m4 create mode 100644 m4/pkg_config.m4 create mode 100644 m4/strict_check_tool.m4 create mode 100644 src/META.in create mode 100644 src/Makefile.in create mode 100644 src/OCamlMakefile create mode 100644 src/duppy.ml create mode 100644 src/duppy.mli create mode 100644 src/duppy_secure_transport.ml create mode 100644 src/duppy_secure_transport.mli create mode 100644 src/duppy_ssl.ml create mode 100644 src/duppy_ssl.mli create mode 100644 src/duppy_stubs.c diff --git a/CHANGES b/CHANGES new file mode 100644 index 0000000..57f6047 --- /dev/null +++ b/CHANGES @@ -0,0 +1,117 @@ +0.8.0 (12-11-2018) +===== +* Removed camlp4 syntactic sugar (unmaintained, unused in liquidsoap now). + +0.7.4 (10-11-2018) +===== +* Fix stack overflow by making recursive function fully tail-rec. (ref savonet/liquidsoap#640) + +0.7.3 (12-09-2018) +===== +* Fix write/select logic on windows systems. (savonet/liquidsoap#610) +* Avoid race conditions when shutting down. + +0.7.2 (28-08-2018) +===== +* Add placeholder implementation for `caml_poll` on Win32. + +0.7.1 (18-08-2018) +===== +* Use poll() when available. +* Wake up all queues when shutting down. + +0.7.0 (03-11-2017) +===== +* Fix bytes compatibility with OCaml 4.06 and above. +* Fix camlp4 availability test. + +0.6.1 (23-08-2017) +===== +* Added SecureTransport support. + +0.6.0 (11-04-2017) +===== +* Added SSL support. + +0.5.2 (03-08-2015) +===== +* Dummy github release. + +0.5.1 (05-08-2013) +===== +* Removed win32 select work-around: patch applied upstream. + +0.5.0 (04-03-2013) +===== +* Remove Panic exception and let original exception bubble through. + +0.4.2 (08-10-2011) +===== +* Reimplemented monadic Mutex and Condition. +* Consume more than one char when waking up Async tasks. + +0.4.1 (04-08-2011) +===== +* Added optional timeout for + all [Duppy.Io] and [Duppy.Monad.Io] + operations. +* Fixed handling of EINTR: update the + timeout when restarting after being + interrupted. + +0.4.0 (26-06-2011) +===== +* Added a monad API to write + server code. +* Close both sides of the pipe + in Duppy.Async +* Make calls to [stop] and [wake_up] + thread-safe in Duppy.Async +* Catch Unix.EINTR when calling Unix.select. + +0.3.2 (19-08-2010) +===== +* Switch from Thread.select to + Unix.select. They are the same on + POSIX and only Unix.select is available + on Win32.. +* Do not use assertions on Mutex.try_lock + on Win32: on this plateform, a thread can + double-lock a mutex, making the assertion + inconsistent. + +0.3.1 (14-10-2009) +===== +* Really catch raised exception on Duppy.Io + operations: catching was missing on recurrent + calls. + +0.3.0 (18-06-2009) +===== +* Added support for --enable-debugging configure option +* Fixed Makefile for BSD: call $(MAKE) for generating documentation. +* Added the possibility to restart the task after the returned positive + delay in Async. +* Added unknown exceptions on Duppy.Io when calling on_error. + +0.2.0 (17-02-2009) +===== +* Fixed typo in Duppy.Async: exception is now Stopped. + +0.1.2 (01-07-2008) +===== +* Changed logic in shutdown for Async interface: + now [Duppy.Async.shutdown t] also wakes the task if + asleep. Still it can't stop a running task. +* Fixed race conditions when a queue starts the select loop: + a task could be submitted, but no queue would wake up. + +0.1.1 (15-04-2008) +===== +* Fixed Conditions usage for non-unix systems +* Fixed typos in the documentation, added some details +* Installs .cmx file + +0.1.0 (07-03-2008) +===== +* Initial release diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..b1e3f5a --- /dev/null +++ b/COPYING @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/Makefile.in b/Makefile.in new file mode 100644 index 0000000..9672296 --- /dev/null +++ b/Makefile.in @@ -0,0 +1,31 @@ +# $Id: Makefile.in 2660 2006-07-18 17:23:31Z dbaelde $ + +PROGNAME := ocaml-duppy +DISTFILES := @AUTOCONF_INSTALL_FILES@ CHANGES COPYING Makefile.in README \ + bootstrap configure configure.ac \ + src/*.ml src/*.mli src/*.c src/Makefile.in src/META.in \ + src/OCamlMakefile examples/*.ml examples/Makefile \ + examples/Makefile.*.in examples/OCamlMakefile +VERSION = @VERSION@ + +all clean install uninstall: + $(MAKE) -C src $@ + +distclean: clean + $(MAKE) -C examples clean + +doc: + $(MAKE) -C src htdoc + mkdir -p doc + rm -rf doc/html + mv src/doc/duppy/html doc + rm -rf src/doc + +dist: + rm -rf $(PROGNAME)-$(VERSION) + mkdir $(PROGNAME)-$(VERSION) + cp -R -L --parents $(DISTFILES) $(PROGNAME)-$(VERSION) + tar zcvf ../$(PROGNAME)-$(VERSION).tar.gz $(PROGNAME)-$(VERSION) + rm -rf $(PROGNAME)-$(VERSION) + +.PHONY: dist doc diff --git a/README b/README new file mode 100644 index 0000000..91f6adc --- /dev/null +++ b/README @@ -0,0 +1,40 @@ +ocaml-duppy + + +ocaml-duppy is an advanced scheduler for Ocaml programmers. + +Please read the COPYING file before using this software. + +Prerequisites: +============== + +- ocaml >= 4.03.0 + +- findlib >= 1.8.0 + +- ocaml-pcre >= 7.3.4 + +The code may work with earlier versions but these are the one currently +supported. + +Compilation: +============ + + $ make all + +This should build both the native and the byte-code version of the +extension library. + +Installation: +============= + + $ make install + +This should install the library file (using ocamlfind) in the +appropriate place. + +Author: +======= + +This author of this software may be contacted by electronic mail +at the following address: savonet-users@lists.sourceforge.net. diff --git a/bootstrap b/bootstrap new file mode 100755 index 0000000..151564b --- /dev/null +++ b/bootstrap @@ -0,0 +1,17 @@ +#!/bin/sh -e + +if [ -d m4 ]; then + OPTIONS="-I m4" + aclocal -I m4 +fi +autoreconf -f -i $OPTIONS $1 +# autoconf maintainers have not yet implemented +# a function to install missing files from autoconf +# itself, so we need to fake a call to automake here.. +automake -a -c -f 2>/dev/null || true +if [ -d examples ]; then + if [ -f examples/configure.ac ]; then + cd examples + autoreconf -f -i + fi +fi diff --git a/config.guess b/config.guess new file mode 100755 index 0000000..f50dcdb --- /dev/null +++ b/config.guess @@ -0,0 +1,1480 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2018 Free Software Foundation, Inc. + +timestamp='2018-02-24' + +# 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: +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +# +# 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. + +Options: + -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-2018 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'`" + + # If ldd exists, use it to detect musl libc. + if command -v ldd >/dev/null && \ + ldd --version 2>&1 | grep -q ^musl + then + LIBC=musl + fi + ;; +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=`(uname -p 2>/dev/null || \ + "/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 ;; + earmv*) + arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` + machine="${arch}${endian}"-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) and ABI. + case "$UNAME_MACHINE_ARCH" in + earm*) + os=netbsdelf + ;; + 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 + # Determine ABI tags. + case "$UNAME_MACHINE_ARCH" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` + ;; + 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/[-_].*//' | cut -d. -f1,2` + ;; + 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}${abi}" + 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 ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" + exit ;; + *:MidnightBSD:*:*) + echo "$UNAME_MACHINE"-unknown-midnightbsd"$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 ;; + *:Sortix:*:*) + echo "$UNAME_MACHINE"-unknown-sortix + exit ;; + *:Redox:*:*) + echo "$UNAME_MACHINE"-unknown-redox + exit ;; + mips:OSF1:*.*) + echo mips-dec-osf1 + 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 ;; + 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:4.4BSD:*) + 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) + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; + esac + echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + 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*: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 ;; + i*:UWIN*:*) + echo "$UNAME_MACHINE"-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-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 "[:upper:]" "[:lower:]"``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 ;; + e2k:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-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 ;; + k1om: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; } + ;; + mips64el:Linux:*:*) + echo "$UNAME_MACHINE"-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 ;; + riscv32:Linux:*:* | riscv64:Linux:*:*) + echo "$UNAME_MACHINE"-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:*:*) + if objdump -f /bin/sh | grep -q elf32-x86-64; then + echo "$UNAME_MACHINE"-pc-linux-"$LIBC"x32 + else + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + fi + 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.*:*) + 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 configure 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 ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-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 + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + 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 ;; + NSV-*:NONSTOP_KERNEL:*:*) + echo nsv-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSX-*:NONSTOP_KERNEL:*:*) + echo nsx-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 ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs + exit ;; +esac + +echo "$0: unable to guess system type" >&2 + +case "$UNAME_MACHINE:$UNAME_SYSTEM" in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 <&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-functions 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/config.sub b/config.sub new file mode 100755 index 0000000..1d8e98b --- /dev/null +++ b/config.sub @@ -0,0 +1,1801 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2018 Free Software Foundation, Inc. + +timestamp='2018-02-22' + +# 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: +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub + +# 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 or ALIAS + +Canonicalize a configuration name. + +Options: + -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-2018 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* | netbsd*-eabi* | \ + kopensolaris*-gnu* | cloudabi*-eabi* | \ + 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/'` + ;; + -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 \ + | ba \ + | be32 | be64 \ + | bfin \ + | c4x | c8051 | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | e2k | epiphany \ + | fido | fr30 | frv | ft32 \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | hexagon \ + | i370 | i860 | i960 | ia16 | 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 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle \ + | pru \ + | pyramid \ + | riscv32 | riscv64 \ + | rl78 | rx \ + | score \ + | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]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 \ + | wasm32 \ + | 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) + ;; + 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-* \ + | ba-* \ + | be32-* | be64-* \ + | bfin-* | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* \ + | c8051-* | clipper-* | craynv-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | e2k-* | elxsi-* \ + | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | hexagon-* \ + | i*86-* | i860-* | i960-* | ia16-* | 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-* \ + | pru-* \ + | pyramid-* \ + | riscv32-* | riscv64-* \ + | 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-* \ + | wasm32-* \ + | 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-pc + 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 + ;; + asmjs) + basic_machine=asmjs-unknown + ;; + 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*) + basic_machine=m68k-bull + os=-sysv3 + ;; + e500v[12]) + basic_machine=powerpc-unknown + os=$os"spe" + ;; + e500v[12]-*) + basic_machine=powerpc-`echo "$basic_machine" | sed 's/^[^-]*-//'` + os=$os"spe" + ;; + 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 + ;; + 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 + ;; + 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 + ;; + 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 + ;; + nsv-tandem) + basic_machine=nsv-tandem + ;; + nsx-tandem) + basic_machine=nsx-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) + 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) + 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 + ;; + sh5el) + basic_machine=sh5le-unknown + ;; + 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 + ;; + x64) + basic_machine=x86_64-pc + ;; + 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 + ;; + 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 + ;; + 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 + ;; + 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 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # es1800 is here to avoid being matched by es* (a different OS) + -es1800*) + os=-ose + ;; + # Now 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* | -cloudabi* | -sortix* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -knetbsd* | -mirbsd* | -netbsd* \ + | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ + | -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* | -glidix* \ + | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ + | -linux-newlib* | -linux-musl* | -linux-uclibc* \ + | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \ + | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* \ + | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox* | -bme* \ + | -midnightbsd*) + # 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 | -xray | -os68k* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* \ + | -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 + ;; + -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 + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -zvmoe) + os=-zvmoe + ;; + -dicos*) + os=-dicos + ;; + -pikeos*) + # Until real need of OS specific support for + # particular features comes up, bare metal + # configurations are quite functional. + case $basic_machine in + arm*) + os=-eabi + ;; + *) + os=-elf + ;; + esac + ;; + -nacl*) + ;; + -ios) + ;; + -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 + ;; + pru-*) + os=-elf + ;; + *-be) + os=-beos + ;; + *-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 + ;; + *-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-functions 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/configure b/configure new file mode 100755 index 0000000..dbaf2c6 --- /dev/null +++ b/configure @@ -0,0 +1,7395 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.69 for ocaml-duppy 0.8.0. +# +# 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" + 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: savonet-users@lists.sourceforge.net about your system, +$0: 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'" + +as_awk_strverscmp=' + # Use only awk features that work with 7th edition Unix awk (1978). + # My, what an old awk you have, Mr. Solaris! + END { + while (length(v1) && length(v2)) { + # Set d1 to be the next thing to compare from v1, and likewise for d2. + # Normally this is a single character, but if v1 and v2 contain digits, + # compare them as integers and fractions as strverscmp does. + if (v1 ~ /^[0-9]/ && v2 ~ /^[0-9]/) { + # Split v1 and v2 into their leading digit string components d1 and d2, + # and advance v1 and v2 past the leading digit strings. + for (len1 = 1; substr(v1, len1 + 1) ~ /^[0-9]/; len1++) continue + for (len2 = 1; substr(v2, len2 + 1) ~ /^[0-9]/; len2++) continue + d1 = substr(v1, 1, len1); v1 = substr(v1, len1 + 1) + d2 = substr(v2, 1, len2); v2 = substr(v2, len2 + 1) + if (d1 ~ /^0/) { + if (d2 ~ /^0/) { + # Compare two fractions. + while (d1 ~ /^0/ && d2 ~ /^0/) { + d1 = substr(d1, 2); len1-- + d2 = substr(d2, 2); len2-- + } + if (len1 != len2 && ! (len1 && len2 && substr(d1, 1, 1) == substr(d2, 1, 1))) { + # The two components differ in length, and the common prefix + # contains only leading zeros. Consider the longer to be less. + d1 = -len1 + d2 = -len2 + } else { + # Otherwise, compare as strings. + d1 = "x" d1 + d2 = "x" d2 + } + } else { + # A fraction is less than an integer. + exit 1 + } + } else { + if (d2 ~ /^0/) { + # An integer is greater than a fraction. + exit 2 + } else { + # Compare two integers. + d1 += 0 + d2 += 0 + } + } + } else { + # The normal case, without worrying about digits. + d1 = substr(v1, 1, 1); v1 = substr(v1, 2) + d2 = substr(v2, 1, 1); v2 = substr(v2, 2) + } + if (d1 < d2) exit 1 + if (d1 > d2) exit 2 + } + # Beware Solaris /usr/xgp4/bin/awk (at least through Solaris 10), + # which mishandles some comparisons of empty strings to integers. + if (length(v2)) exit 1 + if (length(v1)) exit 2 + } +' + +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='ocaml-duppy' +PACKAGE_TARNAME='ocaml-duppy' +PACKAGE_VERSION='0.8.0' +PACKAGE_STRING='ocaml-duppy 0.8.0' +PACKAGE_BUGREPORT='savonet-users@lists.sourceforge.net' +PACKAGE_URL='' + +ac_subst_vars='LTLIBOBJS +LIBOBJS +all_requires +requires +ALL_INC +INC +DUPPY_SECURE_TRANSPORT_META +DUPPY_SECURE_TRANSPORT +W_OSX_SECURE_TRANSPORT +DUPPY_SSL_META +DUPPY_SSL +W_SSL +W_BYTES +W_PCRE +PIC_FLAGS +OCAMLFLAGS +CAMLLIBPATH +OCAMLNCFLAGS +OCAML_STDLIB +OCAMLFIND +CAMLP4RF +CAMLP4R +CAMLP4PROF +CAMLP4ORF +CAMLP4OOF +CAMLP4OF +CAMLP4O +CAMLP4BOOT +CAMLP4 +OCAMLYACC +OCAMLLEXDOTOPT +OCAMLLEX +CAMLIDL +OCAMLBUILD +OCAMLDOCOPT +OCAMLDOC +OCAMLMKLIB +OCAMLMKTOP +OCAMLDEPOPT +OCAMLDEP +OCAML +OCAMLOPTDOTOPT +OCAMLCDOTOPT +OCAML_DYNLINK +OCAMLBEST +OCAMLOPT +OCAMLLIB +OCAMLVERSION +OCAML_HAS_FIRST_CLASS_MODULES +OCAMLC +OCAMLFIND_LDCONF +AR +INSTALL_DATA +INSTALL_SCRIPT +INSTALL_PROGRAM +AUTOCONF_INSTALL_FILES +TARGET_TOOLCHAIN +host_os +host_vendor +host_cpu +host +build_os +build_vendor +build_cpu +build +OBJEXT +EXEEXT +ac_ct_CC +CPPFLAGS +LDFLAGS +CFLAGS +CC +VERSION +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 +runstatedir +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_ldconf +enable_camlp4 +enable_debugging +with_ocaml_warnings +enable_profiling +enable_nativecode +enable_custom +enable_pic +with_pcre_dir +enable_pcre_dynamic_plugin +with_bytes_dir +enable_bytes_dynamic_plugin +with_ssl_dir +enable_ssl_dynamic_plugin +with_osx_secure_transport_dir +enable_osx_secure_transport_dynamic_plugin +' + ac_precious_vars='build_alias +host_alias +target_alias +CC +CFLAGS +LDFLAGS +LIBS +CPPFLAGS +PIC_FLAGS' + + +# 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' +runstatedir='${localstatedir}/run' +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 ;; + + -runstatedir | --runstatedir | --runstatedi | --runstated \ + | --runstate | --runstat | --runsta | --runst | --runs \ + | --run | --ru | --r) + ac_prev=runstatedir ;; + -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \ + | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \ + | --run=* | --ru=* | --r=*) + runstatedir=$ac_optarg ;; + + -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 runstatedir +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 ocaml-duppy 0.8.0 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] + --runstatedir=DIR modifiable per-process data [LOCALSTATEDIR/run] + --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/ocaml-duppy] + --htmldir=DIR html documentation [DOCDIR] + --dvidir=DIR dvi documentation [DOCDIR] + --pdfdir=DIR pdf documentation [DOCDIR] + --psdir=DIR ps documentation [DOCDIR] +_ACEOF + + cat <<\_ACEOF + +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 ocaml-duppy 0.8.0:";; + 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] + --disable-ldconf don't modify the dynamic loader configuration file + (default is enable) + --disable-camlp4 disable camlp4 auto-detection. + --disable-debugging disable debugging information (backtrace printing in + particular) + --enable-profiling compile to generate profiling infomation + --disable-nativecode compile in bytecode + --disable-custom disable custom mode for bytecode compilation (use if + you know what you are doing) + --disable-pic compile PIC objects [default=enabled for shared + builds on supported platforms] + --enable-pcre-dynamic-plugin + Compile pcre as an optional dynamic plugin. + --enable-bytes-dynamic-plugin + Compile bytes as an optional dynamic plugin. + --enable-ssl-dynamic-plugin + Compile ssl as an optional dynamic plugin. + --enable-osx-secure-transport-dynamic-plugin + Compile osx-secure-transport as an optional dynamic + plugin. + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-ocaml-warnings=WARNINGS + Enable specific list of ocaml compiler warnings. + --with-pcre-dir=path look for ocaml-pcre library in "path" + (autodetected by default) + --with-bytes-dir=path look for ocaml-bytes library in "path" + (autodetected by default) + --with-ssl-dir=path look for ocaml-ssl library in "path" + (autodetected by default) + --with-osx_secure_transport-dir=path + look for ocaml-osx_secure_transport library in "path" + (autodetected by default) + +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 + PIC_FLAGS compiler flags for PIC code + +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 +ocaml-duppy configure 0.8.0 +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_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 +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 ocaml-duppy $as_me 0.8.0, 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 + + + +VERSION=$PACKAGE_VERSION + +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: configuring $PACKAGE_STRING" >&5 +$as_echo "configuring $PACKAGE_STRING" >&6; } + +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_aux_dir= +for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; 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 \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$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. + + +# 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 + + +# 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 target toolchain" >&5 +$as_echo_n "checking target toolchain... " >&6; } +case "${host_os}" in + linux*) + TARGET_TOOLCHAIN="linux" + ;; + mingw*) + TARGET_TOOLCHAIN="mingw" + ;; + cygwin*) + TARGET_TOOLCHAIN="cygwin" + ;; + darwin*) + TARGET_TOOLCHAIN="darwin" + ;; + *) + TARGET_TOOLCHAIN="other" + ;; +esac +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $TARGET_TOOLCHAIN" >&5 +$as_echo "$TARGET_TOOLCHAIN" >&6; } + + +# AC_CANONICAL_HOST needs those files +AUTOCONF_INSTALL_FILES="config.guess config.sub install-sh m4/*.m4" + + +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 + +{ $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 + + +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="no" + 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 + + + +OCAMLFIND_LDCONF="" +# Check whether --enable-ldconf was given. +if test "${enable_ldconf+set}" = set; then : + enableval=$enable_ldconf; ac_enable_ldconf=$enableval +else + ac_enable_ldconf=$enableval +fi + +if test "$ac_enable_ldconf" = no ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: disabling modification of ld.conf" >&5 +$as_echo "disabling modification of ld.conf" >&6; } + OCAMLFIND_LDCONF=dummy +fi + + +# Check for Ocaml compilers + + # checking for ocamlc + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ocamlc", so it can be a program name with args. +set dummy ${ac_tool_prefix}ocamlc; 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_OCAMLC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OCAMLC"; then + ac_cv_prog_OCAMLC="$OCAMLC" # 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_OCAMLC="${ac_tool_prefix}ocamlc" + $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 +OCAMLC=$ac_cv_prog_OCAMLC +if test -n "$OCAMLC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLC" >&5 +$as_echo "$OCAMLC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OCAMLC"; then + ac_ct_OCAMLC=$OCAMLC + # Extract the first word of "ocamlc", so it can be a program name with args. +set dummy ocamlc; 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_OCAMLC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OCAMLC"; then + ac_cv_prog_ac_ct_OCAMLC="$ac_ct_OCAMLC" # 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_OCAMLC="ocamlc" + $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_OCAMLC=$ac_cv_prog_ac_ct_OCAMLC +if test -n "$ac_ct_OCAMLC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OCAMLC" >&5 +$as_echo "$ac_ct_OCAMLC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OCAMLC" = x; then + OCAMLC="no" + 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 + OCAMLC=$ac_ct_OCAMLC + fi +else + OCAMLC="$ac_cv_prog_OCAMLC" +fi + + + if test "$OCAMLC" = "no"; then + as_fn_error $? "Cannot find ocamlc." "$LINENO" 5 + fi + + + + OCAMLVERSION=`$OCAMLC -v | sed -n -e 's|.*version* *\(.*\)$|\1|p'` + { $as_echo "$as_me:${as_lineno-$LINENO}: result: OCaml version is $OCAMLVERSION" >&5 +$as_echo "OCaml version is $OCAMLVERSION" >&6; } + # Check if version is >= 3.12.0 + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if ocaml compiler supports first-class modules" >&5 +$as_echo_n "checking if ocaml compiler supports first-class modules... " >&6; } + as_arg_v1=$OCAMLVERSION +as_arg_v2=3.12.0 +awk "$as_awk_strverscmp" v1="$as_arg_v1" v2="$as_arg_v2" /dev/null +case $? in #( + 1) : + ;; #( + 0) : + OCAML_HAS_FIRST_CLASS_MODULES="yes" ;; #( + 2) : + OCAML_HAS_FIRST_CLASS_MODULES="yes" ;; #( + *) : + ;; +esac + if test -n "${OCAML_HAS_FIRST_CLASS_MODULES}"; 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; } + fi + + + # If OCAMLLIB is set, use it + if test "$OCAMLLIB" = ""; then + OCAMLLIB=`$OCAMLC -where 2>/dev/null || $OCAMLC -v|tail -1|cut -d ' ' -f 4` + else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: OCAMLLIB previously set; preserving it." >&5 +$as_echo "OCAMLLIB previously set; preserving it." >&6; } + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: OCaml library path is $OCAMLLIB" >&5 +$as_echo "OCaml library path is $OCAMLLIB" >&6; } + + + + + # checking for ocamlopt + # Extract the first word of "${ac_tool_prefix}ocamlopt", so it can be a program name with args. +set dummy ${ac_tool_prefix}ocamlopt; 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_OCAMLOPT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OCAMLOPT"; then + ac_cv_prog_OCAMLOPT="$OCAMLOPT" # 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_OCAMLOPT="${ac_tool_prefix}ocamlopt" + $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_prog_OCAMLOPT" && ac_cv_prog_OCAMLOPT="no" +fi +fi +OCAMLOPT=$ac_cv_prog_OCAMLOPT +if test -n "$OCAMLOPT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLOPT" >&5 +$as_echo "$OCAMLOPT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + OCAMLBEST=byte + OCAML_DYNLINK=byte-dyn + if test "$OCAMLOPT" = "no"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Cannot find ocamlopt; bytecode compilation only." >&5 +$as_echo "$as_me: WARNING: Cannot find ocamlopt; bytecode compilation only." >&2;} + else + TMPVERSION=`$OCAMLOPT -v | sed -n -e 's|.*version* *\(.*\)$|\1|p' ` + if test "$TMPVERSION" != "$OCAMLVERSION" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: versions differs from ocamlc; ocamlopt discarded." >&5 +$as_echo "versions differs from ocamlc; ocamlopt discarded." >&6; } + OCAMLOPT=no + else + OCAMLBEST="byte opt" + OCAML_DYNLINK="byte-dyn opt-dyn" + fi + fi + + + + + # checking for ocamlc.opt + # Extract the first word of "${ac_tool_prefix}ocamlc.opt", so it can be a program name with args. +set dummy ${ac_tool_prefix}ocamlc.opt; 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_OCAMLCDOTOPT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OCAMLCDOTOPT"; then + ac_cv_prog_OCAMLCDOTOPT="$OCAMLCDOTOPT" # 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_OCAMLCDOTOPT="${ac_tool_prefix}ocamlc.opt" + $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_prog_OCAMLCDOTOPT" && ac_cv_prog_OCAMLCDOTOPT="no" +fi +fi +OCAMLCDOTOPT=$ac_cv_prog_OCAMLCDOTOPT +if test -n "$OCAMLCDOTOPT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLCDOTOPT" >&5 +$as_echo "$OCAMLCDOTOPT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "$OCAMLCDOTOPT" != "no"; then + TMPVERSION=`$OCAMLCDOTOPT -v | sed -n -e 's|.*version* *\(.*\)$|\1|p' ` + if test "$TMPVERSION" != "$OCAMLVERSION" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: versions differs from ocamlc; ocamlc.opt discarded." >&5 +$as_echo "versions differs from ocamlc; ocamlc.opt discarded." >&6; } + else + OCAMLC=$OCAMLCDOTOPT + fi + fi + + # checking for ocamlopt.opt + if test "$OCAMLOPT" != "no" ; then + # Extract the first word of "${ac_tool_prefix}ocamlopt.opt", so it can be a program name with args. +set dummy ${ac_tool_prefix}ocamlopt.opt; 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_OCAMLOPTDOTOPT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OCAMLOPTDOTOPT"; then + ac_cv_prog_OCAMLOPTDOTOPT="$OCAMLOPTDOTOPT" # 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_OCAMLOPTDOTOPT="${ac_tool_prefix}ocamlopt.opt" + $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_prog_OCAMLOPTDOTOPT" && ac_cv_prog_OCAMLOPTDOTOPT="no" +fi +fi +OCAMLOPTDOTOPT=$ac_cv_prog_OCAMLOPTDOTOPT +if test -n "$OCAMLOPTDOTOPT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLOPTDOTOPT" >&5 +$as_echo "$OCAMLOPTDOTOPT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "$OCAMLOPTDOTOPT" != "no"; then + TMPVERSION=`$OCAMLOPTDOTOPT -v | sed -n -e 's|.*version* *\(.*\)$|\1|p' ` + if test "$TMPVERSION" != "$OCAMLVERSION" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: version differs from ocamlc; ocamlopt.opt discarded." >&5 +$as_echo "version differs from ocamlc; ocamlopt.opt discarded." >&6; } + else + OCAMLOPT=$OCAMLOPTDOTOPT + fi + fi + fi + + + + # checking for ocaml toplevel + # Extract the first word of "${ac_tool_prefix}ocaml", so it can be a program name with args. +set dummy ${ac_tool_prefix}ocaml; 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_OCAML+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OCAML"; then + ac_cv_prog_OCAML="$OCAML" # 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_OCAML="${ac_tool_prefix}ocaml" + $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_prog_OCAML" && ac_cv_prog_OCAML="no" +fi +fi +OCAML=$ac_cv_prog_OCAML +if test -n "$OCAML"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAML" >&5 +$as_echo "$OCAML" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + + # checking for ocamldep + # Extract the first word of "${ac_tool_prefix}ocamldep", so it can be a program name with args. +set dummy ${ac_tool_prefix}ocamldep; 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_OCAMLDEP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OCAMLDEP"; then + ac_cv_prog_OCAMLDEP="$OCAMLDEP" # 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_OCAMLDEP="${ac_tool_prefix}ocamldep" + $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_prog_OCAMLDEP" && ac_cv_prog_OCAMLDEP="no" +fi +fi +OCAMLDEP=$ac_cv_prog_OCAMLDEP +if test -n "$OCAMLDEP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLDEP" >&5 +$as_echo "$OCAMLDEP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "$OCAMLDEP" = "no"; then + as_fn_error $? "Cannot find ocamlmklib." "$LINENO" 5 + else + # Extract the first word of "${ac_tool_prefix}ocamldep.opt", so it can be a program name with args. +set dummy ${ac_tool_prefix}ocamldep.opt; 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_OCAMLDEPOPT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OCAMLDEPOPT"; then + ac_cv_prog_OCAMLDEPOPT="$OCAMLDEPOPT" # 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_OCAMLDEPOPT="${ac_tool_prefix}ocamldep.opt" + $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_prog_OCAMLDEPOPT" && ac_cv_prog_OCAMLDEPOPT="no" +fi +fi +OCAMLDEPOPT=$ac_cv_prog_OCAMLDEPOPT +if test -n "$OCAMLDEPOPT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLDEPOPT" >&5 +$as_echo "$OCAMLDEPOPT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "$OCAMLDEPOPT" != "no"; then + OCAMLDEP=$OCAMLDEPOPT + fi + fi + + + + # checking for ocamlmktop + # Extract the first word of "${ac_tool_prefix}ocamlmktop", so it can be a program name with args. +set dummy ${ac_tool_prefix}ocamlmktop; 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_OCAMLMKTOP+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OCAMLMKTOP"; then + ac_cv_prog_OCAMLMKTOP="$OCAMLMKTOP" # 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_OCAMLMKTOP="${ac_tool_prefix}ocamlmktop" + $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_prog_OCAMLMKTOP" && ac_cv_prog_OCAMLMKTOP="no" +fi +fi +OCAMLMKTOP=$ac_cv_prog_OCAMLMKTOP +if test -n "$OCAMLMKTOP"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLMKTOP" >&5 +$as_echo "$OCAMLMKTOP" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + + + + # checking for ocamlmklib + # Extract the first word of "${ac_tool_prefix}ocamlmklib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ocamlmklib; 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_OCAMLMKLIB+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OCAMLMKLIB"; then + ac_cv_prog_OCAMLMKLIB="$OCAMLMKLIB" # 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_OCAMLMKLIB="${ac_tool_prefix}ocamlmklib" + $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_prog_OCAMLMKLIB" && ac_cv_prog_OCAMLMKLIB="no" +fi +fi +OCAMLMKLIB=$ac_cv_prog_OCAMLMKLIB +if test -n "$OCAMLMKLIB"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLMKLIB" >&5 +$as_echo "$OCAMLMKLIB" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "$OCAMLMKLIB" = "no"; then + as_fn_error $? "Cannot find ocamlmklib." "$LINENO" 5 + fi + + + + # checking for ocamldoc + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ocamldoc", so it can be a program name with args. +set dummy ${ac_tool_prefix}ocamldoc; 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_OCAMLDOC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OCAMLDOC"; then + ac_cv_prog_OCAMLDOC="$OCAMLDOC" # 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_OCAMLDOC="${ac_tool_prefix}ocamldoc" + $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 +OCAMLDOC=$ac_cv_prog_OCAMLDOC +if test -n "$OCAMLDOC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLDOC" >&5 +$as_echo "$OCAMLDOC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OCAMLDOC"; then + ac_ct_OCAMLDOC=$OCAMLDOC + # Extract the first word of "ocamldoc", so it can be a program name with args. +set dummy ocamldoc; 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_OCAMLDOC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OCAMLDOC"; then + ac_cv_prog_ac_ct_OCAMLDOC="$ac_ct_OCAMLDOC" # 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_OCAMLDOC="ocamldoc" + $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_OCAMLDOC=$ac_cv_prog_ac_ct_OCAMLDOC +if test -n "$ac_ct_OCAMLDOC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OCAMLDOC" >&5 +$as_echo "$ac_ct_OCAMLDOC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OCAMLDOC" = x; then + OCAMLDOC="no" + 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 + OCAMLDOC=$ac_ct_OCAMLDOC + fi +else + OCAMLDOC="$ac_cv_prog_OCAMLDOC" +fi + + if test "$OCAMLDOC" != "no"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ocamldoc.opt", so it can be a program name with args. +set dummy ${ac_tool_prefix}ocamldoc.opt; 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_OCAMLDOCOPT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OCAMLDOCOPT"; then + ac_cv_prog_OCAMLDOCOPT="$OCAMLDOCOPT" # 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_OCAMLDOCOPT="${ac_tool_prefix}ocamldoc.opt" + $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 +OCAMLDOCOPT=$ac_cv_prog_OCAMLDOCOPT +if test -n "$OCAMLDOCOPT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLDOCOPT" >&5 +$as_echo "$OCAMLDOCOPT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OCAMLDOCOPT"; then + ac_ct_OCAMLDOCOPT=$OCAMLDOCOPT + # Extract the first word of "ocamldoc.opt", so it can be a program name with args. +set dummy ocamldoc.opt; 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_OCAMLDOCOPT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OCAMLDOCOPT"; then + ac_cv_prog_ac_ct_OCAMLDOCOPT="$ac_ct_OCAMLDOCOPT" # 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_OCAMLDOCOPT="ocamldoc.opt" + $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_OCAMLDOCOPT=$ac_cv_prog_ac_ct_OCAMLDOCOPT +if test -n "$ac_ct_OCAMLDOCOPT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OCAMLDOCOPT" >&5 +$as_echo "$ac_ct_OCAMLDOCOPT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OCAMLDOCOPT" = x; then + OCAMLDOCOPT="no" + 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 + OCAMLDOCOPT=$ac_ct_OCAMLDOCOPT + fi +else + OCAMLDOCOPT="$ac_cv_prog_OCAMLDOCOPT" +fi + + if test "$OCAMLDOCOPT" != "no"; then + OCAMLDOC=$OCAMLDOCOPT + fi + fi + + + + # checking for ocamlbuild + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ocamlbuild", so it can be a program name with args. +set dummy ${ac_tool_prefix}ocamlbuild; 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_OCAMLBUILD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OCAMLBUILD"; then + ac_cv_prog_OCAMLBUILD="$OCAMLBUILD" # 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_OCAMLBUILD="${ac_tool_prefix}ocamlbuild" + $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 +OCAMLBUILD=$ac_cv_prog_OCAMLBUILD +if test -n "$OCAMLBUILD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLBUILD" >&5 +$as_echo "$OCAMLBUILD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OCAMLBUILD"; then + ac_ct_OCAMLBUILD=$OCAMLBUILD + # Extract the first word of "ocamlbuild", so it can be a program name with args. +set dummy ocamlbuild; 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_OCAMLBUILD+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OCAMLBUILD"; then + ac_cv_prog_ac_ct_OCAMLBUILD="$ac_ct_OCAMLBUILD" # 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_OCAMLBUILD="ocamlbuild" + $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_OCAMLBUILD=$ac_cv_prog_ac_ct_OCAMLBUILD +if test -n "$ac_ct_OCAMLBUILD"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OCAMLBUILD" >&5 +$as_echo "$ac_ct_OCAMLBUILD" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OCAMLBUILD" = x; then + OCAMLBUILD="no" + 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 + OCAMLBUILD=$ac_ct_OCAMLBUILD + fi +else + OCAMLBUILD="$ac_cv_prog_OCAMLBUILD" +fi + + + + + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}camlidl", so it can be a program name with args. +set dummy ${ac_tool_prefix}camlidl; 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_CAMLIDL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CAMLIDL"; then + ac_cv_prog_CAMLIDL="$CAMLIDL" # 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_CAMLIDL="${ac_tool_prefix}camlidl" + $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 +CAMLIDL=$ac_cv_prog_CAMLIDL +if test -n "$CAMLIDL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CAMLIDL" >&5 +$as_echo "$CAMLIDL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_CAMLIDL"; then + ac_ct_CAMLIDL=$CAMLIDL + # Extract the first word of "camlidl", so it can be a program name with args. +set dummy camlidl; 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_CAMLIDL+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_CAMLIDL"; then + ac_cv_prog_ac_ct_CAMLIDL="$ac_ct_CAMLIDL" # 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_CAMLIDL="camlidl" + $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_CAMLIDL=$ac_cv_prog_ac_ct_CAMLIDL +if test -n "$ac_ct_CAMLIDL"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CAMLIDL" >&5 +$as_echo "$ac_ct_CAMLIDL" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_CAMLIDL" = x; then + CAMLIDL="no" + 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 + CAMLIDL=$ac_ct_CAMLIDL + fi +else + CAMLIDL="$ac_cv_prog_CAMLIDL" +fi + + + + + # checking for ocamllex + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ocamllex", so it can be a program name with args. +set dummy ${ac_tool_prefix}ocamllex; 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_OCAMLLEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OCAMLLEX"; then + ac_cv_prog_OCAMLLEX="$OCAMLLEX" # 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_OCAMLLEX="${ac_tool_prefix}ocamllex" + $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 +OCAMLLEX=$ac_cv_prog_OCAMLLEX +if test -n "$OCAMLLEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLLEX" >&5 +$as_echo "$OCAMLLEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OCAMLLEX"; then + ac_ct_OCAMLLEX=$OCAMLLEX + # Extract the first word of "ocamllex", so it can be a program name with args. +set dummy ocamllex; 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_OCAMLLEX+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OCAMLLEX"; then + ac_cv_prog_ac_ct_OCAMLLEX="$ac_ct_OCAMLLEX" # 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_OCAMLLEX="ocamllex" + $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_OCAMLLEX=$ac_cv_prog_ac_ct_OCAMLLEX +if test -n "$ac_ct_OCAMLLEX"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OCAMLLEX" >&5 +$as_echo "$ac_ct_OCAMLLEX" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OCAMLLEX" = x; then + OCAMLLEX="no" + 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 + OCAMLLEX=$ac_ct_OCAMLLEX + fi +else + OCAMLLEX="$ac_cv_prog_OCAMLLEX" +fi + + if test "$OCAMLLEX" != "no"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ocamllex.opt", so it can be a program name with args. +set dummy ${ac_tool_prefix}ocamllex.opt; 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_OCAMLLEXDOTOPT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OCAMLLEXDOTOPT"; then + ac_cv_prog_OCAMLLEXDOTOPT="$OCAMLLEXDOTOPT" # 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_OCAMLLEXDOTOPT="${ac_tool_prefix}ocamllex.opt" + $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 +OCAMLLEXDOTOPT=$ac_cv_prog_OCAMLLEXDOTOPT +if test -n "$OCAMLLEXDOTOPT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLLEXDOTOPT" >&5 +$as_echo "$OCAMLLEXDOTOPT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OCAMLLEXDOTOPT"; then + ac_ct_OCAMLLEXDOTOPT=$OCAMLLEXDOTOPT + # Extract the first word of "ocamllex.opt", so it can be a program name with args. +set dummy ocamllex.opt; 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_OCAMLLEXDOTOPT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OCAMLLEXDOTOPT"; then + ac_cv_prog_ac_ct_OCAMLLEXDOTOPT="$ac_ct_OCAMLLEXDOTOPT" # 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_OCAMLLEXDOTOPT="ocamllex.opt" + $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_OCAMLLEXDOTOPT=$ac_cv_prog_ac_ct_OCAMLLEXDOTOPT +if test -n "$ac_ct_OCAMLLEXDOTOPT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OCAMLLEXDOTOPT" >&5 +$as_echo "$ac_ct_OCAMLLEXDOTOPT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OCAMLLEXDOTOPT" = x; then + OCAMLLEXDOTOPT="no" + 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 + OCAMLLEXDOTOPT=$ac_ct_OCAMLLEXDOTOPT + fi +else + OCAMLLEXDOTOPT="$ac_cv_prog_OCAMLLEXDOTOPT" +fi + + if test "$OCAMLLEXDOTOPT" != "no"; then + OCAMLLEX=$OCAMLLEXDOTOPT + fi + fi + + + + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ocamlyacc", so it can be a program name with args. +set dummy ${ac_tool_prefix}ocamlyacc; 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_OCAMLYACC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OCAMLYACC"; then + ac_cv_prog_OCAMLYACC="$OCAMLYACC" # 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_OCAMLYACC="${ac_tool_prefix}ocamlyacc" + $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 +OCAMLYACC=$ac_cv_prog_OCAMLYACC +if test -n "$OCAMLYACC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLYACC" >&5 +$as_echo "$OCAMLYACC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OCAMLYACC"; then + ac_ct_OCAMLYACC=$OCAMLYACC + # Extract the first word of "ocamlyacc", so it can be a program name with args. +set dummy ocamlyacc; 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_OCAMLYACC+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OCAMLYACC"; then + ac_cv_prog_ac_ct_OCAMLYACC="$ac_ct_OCAMLYACC" # 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_OCAMLYACC="ocamlyacc" + $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_OCAMLYACC=$ac_cv_prog_ac_ct_OCAMLYACC +if test -n "$ac_ct_OCAMLYACC"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OCAMLYACC" >&5 +$as_echo "$ac_ct_OCAMLYACC" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OCAMLYACC" = x; then + OCAMLYACC="no" + 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 + OCAMLYACC=$ac_ct_OCAMLYACC + fi +else + OCAMLYACC="$ac_cv_prog_OCAMLYACC" +fi + + + + + + + # Check whether --enable-camlp4 was given. +if test "${enable_camlp4+set}" = set; then : + enableval=$enable_camlp4; +fi + + + # checking for camlp4 + if test "x$enable_camlp4" != "xno"; then + # Extract the first word of "${ac_tool_prefix}camlp4", so it can be a program name with args. +set dummy ${ac_tool_prefix}camlp4; 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_CAMLP4+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CAMLP4"; then + ac_cv_prog_CAMLP4="$CAMLP4" # 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_CAMLP4="${ac_tool_prefix}camlp4" + $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_prog_CAMLP4" && ac_cv_prog_CAMLP4="no" +fi +fi +CAMLP4=$ac_cv_prog_CAMLP4 +if test -n "$CAMLP4"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CAMLP4" >&5 +$as_echo "$CAMLP4" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + if test "$CAMLP4" != "no"; then + TMPVERSION=`$CAMLP4 -v 2>&1| sed -n -e 's|.*version *\(.*\)$|\1|p' | tr -d '\r'` + if test "$TMPVERSION" != "$OCAMLVERSION" ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: versions differs from ocamlc" >&5 +$as_echo "versions differs from ocamlc" >&6; } + CAMLP4=no + fi + fi + + + # checking for companion tools + # Extract the first word of "${ac_tool_prefix}camlp4boot", so it can be a program name with args. +set dummy ${ac_tool_prefix}camlp4boot; 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_CAMLP4BOOT+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CAMLP4BOOT"; then + ac_cv_prog_CAMLP4BOOT="$CAMLP4BOOT" # 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_CAMLP4BOOT="${ac_tool_prefix}camlp4boot" + $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_prog_CAMLP4BOOT" && ac_cv_prog_CAMLP4BOOT="no" +fi +fi +CAMLP4BOOT=$ac_cv_prog_CAMLP4BOOT +if test -n "$CAMLP4BOOT"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CAMLP4BOOT" >&5 +$as_echo "$CAMLP4BOOT" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + # Extract the first word of "${ac_tool_prefix}camlp4o", so it can be a program name with args. +set dummy ${ac_tool_prefix}camlp4o; 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_CAMLP4O+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CAMLP4O"; then + ac_cv_prog_CAMLP4O="$CAMLP4O" # 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_CAMLP4O="${ac_tool_prefix}camlp4o" + $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_prog_CAMLP4O" && ac_cv_prog_CAMLP4O="no" +fi +fi +CAMLP4O=$ac_cv_prog_CAMLP4O +if test -n "$CAMLP4O"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CAMLP4O" >&5 +$as_echo "$CAMLP4O" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + # Extract the first word of "${ac_tool_prefix}camlp4of", so it can be a program name with args. +set dummy ${ac_tool_prefix}camlp4of; 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_CAMLP4OF+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CAMLP4OF"; then + ac_cv_prog_CAMLP4OF="$CAMLP4OF" # 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_CAMLP4OF="${ac_tool_prefix}camlp4of" + $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_prog_CAMLP4OF" && ac_cv_prog_CAMLP4OF="no" +fi +fi +CAMLP4OF=$ac_cv_prog_CAMLP4OF +if test -n "$CAMLP4OF"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CAMLP4OF" >&5 +$as_echo "$CAMLP4OF" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + # Extract the first word of "${ac_tool_prefix}camlp4oof", so it can be a program name with args. +set dummy ${ac_tool_prefix}camlp4oof; 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_CAMLP4OOF+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CAMLP4OOF"; then + ac_cv_prog_CAMLP4OOF="$CAMLP4OOF" # 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_CAMLP4OOF="${ac_tool_prefix}camlp4oof" + $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_prog_CAMLP4OOF" && ac_cv_prog_CAMLP4OOF="no" +fi +fi +CAMLP4OOF=$ac_cv_prog_CAMLP4OOF +if test -n "$CAMLP4OOF"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CAMLP4OOF" >&5 +$as_echo "$CAMLP4OOF" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + # Extract the first word of "${ac_tool_prefix}camlp4orf", so it can be a program name with args. +set dummy ${ac_tool_prefix}camlp4orf; 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_CAMLP4ORF+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CAMLP4ORF"; then + ac_cv_prog_CAMLP4ORF="$CAMLP4ORF" # 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_CAMLP4ORF="${ac_tool_prefix}camlp4orf" + $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_prog_CAMLP4ORF" && ac_cv_prog_CAMLP4ORF="no" +fi +fi +CAMLP4ORF=$ac_cv_prog_CAMLP4ORF +if test -n "$CAMLP4ORF"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CAMLP4ORF" >&5 +$as_echo "$CAMLP4ORF" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + # Extract the first word of "${ac_tool_prefix}camlp4prof", so it can be a program name with args. +set dummy ${ac_tool_prefix}camlp4prof; 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_CAMLP4PROF+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CAMLP4PROF"; then + ac_cv_prog_CAMLP4PROF="$CAMLP4PROF" # 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_CAMLP4PROF="${ac_tool_prefix}camlp4prof" + $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_prog_CAMLP4PROF" && ac_cv_prog_CAMLP4PROF="no" +fi +fi +CAMLP4PROF=$ac_cv_prog_CAMLP4PROF +if test -n "$CAMLP4PROF"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CAMLP4PROF" >&5 +$as_echo "$CAMLP4PROF" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + # Extract the first word of "${ac_tool_prefix}camlp4r", so it can be a program name with args. +set dummy ${ac_tool_prefix}camlp4r; 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_CAMLP4R+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CAMLP4R"; then + ac_cv_prog_CAMLP4R="$CAMLP4R" # 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_CAMLP4R="${ac_tool_prefix}camlp4r" + $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_prog_CAMLP4R" && ac_cv_prog_CAMLP4R="no" +fi +fi +CAMLP4R=$ac_cv_prog_CAMLP4R +if test -n "$CAMLP4R"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CAMLP4R" >&5 +$as_echo "$CAMLP4R" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + # Extract the first word of "${ac_tool_prefix}camlp4rf", so it can be a program name with args. +set dummy ${ac_tool_prefix}camlp4rf; 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_CAMLP4RF+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$CAMLP4RF"; then + ac_cv_prog_CAMLP4RF="$CAMLP4RF" # 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_CAMLP4RF="${ac_tool_prefix}camlp4rf" + $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_prog_CAMLP4RF" && ac_cv_prog_CAMLP4RF="no" +fi +fi +CAMLP4RF=$ac_cv_prog_CAMLP4RF +if test -n "$CAMLP4RF"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CAMLP4RF" >&5 +$as_echo "$CAMLP4RF" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + else + CAMLP4=no + CAMLP4BOOT=no + CAMLP4O=no + CAMLP4OF=no + CAMLP4OOF=no + CAMLP4ORF=no + CAMLP4PROF=no + CAMLP4R=no + CAMLP4RF=no + fi + + + + + + + + + + + + + # checking for ocamlfind + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ocamlfind", so it can be a program name with args. +set dummy ${ac_tool_prefix}ocamlfind; 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_OCAMLFIND+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$OCAMLFIND"; then + ac_cv_prog_OCAMLFIND="$OCAMLFIND" # 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_OCAMLFIND="${ac_tool_prefix}ocamlfind" + $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 +OCAMLFIND=$ac_cv_prog_OCAMLFIND +if test -n "$OCAMLFIND"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAMLFIND" >&5 +$as_echo "$OCAMLFIND" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + +fi +if test -z "$ac_cv_prog_OCAMLFIND"; then + ac_ct_OCAMLFIND=$OCAMLFIND + # Extract the first word of "ocamlfind", so it can be a program name with args. +set dummy ocamlfind; 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_OCAMLFIND+:} false; then : + $as_echo_n "(cached) " >&6 +else + if test -n "$ac_ct_OCAMLFIND"; then + ac_cv_prog_ac_ct_OCAMLFIND="$ac_ct_OCAMLFIND" # 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_OCAMLFIND="ocamlfind" + $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_OCAMLFIND=$ac_cv_prog_ac_ct_OCAMLFIND +if test -n "$ac_ct_OCAMLFIND"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_OCAMLFIND" >&5 +$as_echo "$ac_ct_OCAMLFIND" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + if test "x$ac_ct_OCAMLFIND" = x; then + OCAMLFIND="no" + 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 + OCAMLFIND=$ac_ct_OCAMLFIND + fi +else + OCAMLFIND="$ac_cv_prog_OCAMLFIND" +fi + + + + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ocaml standard library path" >&5 +$as_echo_n "checking for ocaml standard library path... " >&6; } + OCAML_STDLIB=`$OCAMLFIND printconf stdlib` + + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $OCAML_STDLIB" >&5 +$as_echo "$OCAML_STDLIB" >&6; } + + +# Check if caml/threads.h is present +old_CFLAGS=$CFLAGS +CFLAGS="$CFLAGS -I${OCAML_STDLIB}" +ac_fn_c_check_header_compile "$LINENO" "caml/threads.h" "ac_cv_header_caml_threads_h" "#include +" +if test "x$ac_cv_header_caml_threads_h" = xyes; then : + CAML_THREADS=yes +fi + + +CFLAGS=${old_CFLAGS} + +# Check whether --enable-debugging was given. +if test "${enable_debugging+set}" = set; then : + enableval=$enable_debugging; +fi + + +if test "$enable_debugging" \!= "no" ; then + OCAMLFLAGS="$OCAMLFLAGS -g" +fi + + +# Check whether --with-ocaml-warnings was given. +if test "${with_ocaml_warnings+set}" = set; then : + withval=$with_ocaml_warnings; +fi + + +if test -n "${with_ocaml_warnings}" ; then + OCAMLFLAGS="$OCAMLFLAGS -w +${with_ocaml_warnings}" +else + OCAMLFLAGS="$OCAMLFLAGS -w +A-4@5-7@8-9@11@12@20-35-44-45-50" +fi + +# Check whether --enable-profiling was given. +if test "${enable_profiling+set}" = set; then : + enableval=$enable_profiling; +fi + +if test "x$enable_profiling" = "xyes" ; then + OCAMLNCFLAGS="$OCAMLNCFLAGS -p" +fi + + +# Check whether --enable-nativecode was given. +if test "${enable_nativecode+set}" = set; then : + enableval=$enable_nativecode; +fi + + +# Check whether --enable-custom was given. +if test "${enable_custom+set}" = set; then : + enableval=$enable_custom; +fi + + +CAMLLIBPATH=$OCAMLLIB + + + + + + + +# Check whether --enable-pic was given. +if test "${enable_pic+set}" = set; then : + enableval=$enable_pic; enable_pic="$enableval" + test "x$enable_pic" = x && enable_pic=auto +else + enable_pic=auto +fi + +if test "$enable_pic" = auto && test "$enable_static" = yes; then + enable_pic=no +fi +if test "$enable_pic" != no; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to produce PIC" >&5 +$as_echo_n "checking for $CC option to produce PIC... " >&6; } + if test "x$PIC_FLAGS" = "x"; then + if test "x$GCC" = "xyes"; then + case "$host_os" in + aix*|beos*|cygwin*|irix5*|irix6*|osf3*|osf4*|osf5*) + ;; + mingw*|os2*|pw32*) + PIC_FLAGS="-DDLL_EXPORT" + ;; + darwin*|rhapsody*) + PIC_FLAGS="-fno-common" + ;; + hpux*) + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + PIC_FLAGS="-fPIC" + ;; + esac + ;; + *) + PIC_FLAGS="-fPIC" + ;; + esac + else case "$host_os" in + hpux9*|hpux10*|hpux11*) + case "$host_cpu" in + hppa*64*|ia64*) + ;; + *) + PIC_FLAGS="+Z" + ;; + esac + ;; + linux*|k*bsd*-gnu) + case `basename "$CC"` in + icc*|ecc*|ifort*) + PIC_FLAGS="-KPIC" + ;; + pgcc*|pgf77*|pgf90*|pgf95*) + PIC_FLAGS="-fpic" + ;; + ccc*) + ;; + xl*) + PIC_FLAGS="-qpic" + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*|*Sun\ F*) + PIC_FLAGS="-KPIC" + ;; + esac + esac + ;; + solaris*) + PIC_FLAGS="-KPIC" + ;; + sunos4*) + PIC_FLAGS="-PIC" + ;; + esac + fi + fi + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PIC_FLAGS" >&5 +$as_echo "$PIC_FLAGS" >&6; } +fi + + + +CXXFLAGS="$CXXFLAGS $PIC_FLAGS" +CPPFLAGS="$CPPFLAGS $PIC_FLAGS" + +# Add prefix to compilation variables +# if passed +if test "x$prefix" != "xNONE"; then + CFLAGS="$CFLAGS -I$prefix/include" + LDFLAGS="$LDFLAGS -L$prefix/lib" + CPPFLAGS="$CPPFLAGS -I$prefix/include" + CXXFLAGS="$CXXFLAGS -I$prefix/include" +fi + + + + + + + +if test -n ""; then + BINDING_PKGS="" +else + BINDING_PKGS="pcre" +fi + + +# Check whether --with-pcre-dir was given. +if test "${with_pcre_dir+set}" = set; then : + withval=$with_pcre_dir; +fi + + +# Check whether --enable-pcre-dynamic-plugin was given. +if test "${enable_pcre_dynamic_plugin+set}" = set; then : + enableval=$enable_pcre_dynamic_plugin; +fi + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ocaml pcre module" >&5 +$as_echo_n "checking for ocaml pcre module... " >&6; } + +OCAML_CHECK="${OCAMLFIND} query pcre" + + +if test "x$enable_pcre_dynamic_plugin" = "xyes" ; then + PCRE_SHARED="yes" + PLUGINS="$PLUGINS pcre" +fi + + +DEPS_CHECK=yes +for i in ; do + eval "dep_check=\$W_$i" + if test -z "${dep_check}"; then + DEPS_CHECK= + break + fi +done +if test -z $DEPS_CHECK; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: pcre needs " >&5 +$as_echo "pcre needs " >&6; } +else + if test -z "${with_pcre_dir}" ; then + if ! ${OCAML_CHECK} > /dev/null 2>&1 ; then + as_fn_error $? "Not found." "$LINENO" 5 + else + PCRE_version="`${OCAMLFIND} query -format "%v" pcre 2>/dev/null`" + if test -z "" ; then + VERSION_OK=yes + else + as_arg_v1=${PCRE_version} +as_arg_v2= +awk "$as_awk_strverscmp" v1="$as_arg_v1" v2="$as_arg_v2" /dev/null +case $? in #( + 1) : + VERSION_OK= ;; #( + 0) : + VERSION_OK=yes ;; #( + 2) : + VERSION_OK=yes ;; #( + *) : + ;; +esac +fi + if test -z "${VERSION_OK}"; then + as_fn_error $? "requires version >= found ${PCRE_version}." "$LINENO" 5 + else + if test -z "${PCRE_SHARED}"; then + PCRE_PACKAGES="`${OCAMLFIND} query -separator " " -format "-package %p" $BINDING_PKGS 2>/dev/null`" + liquidsoap_ocamlcflags="${liquidsoap_ocamlcflags} ${PCRE_PACKAGES}" + W_PCRE=yes + else + pcre_packages="`${OCAMLFIND} query -r -separator " " -format "%p" $BINDING_PKGS 2>/dev/null`" + W_PCRE=pcre + fi + LIBS_VERSIONS="${LIBS_VERSIONS} pcre=$PCRE_version" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } + fi + fi + else + PCRE_STOP_CHECK= + PCRE_version="[unknown version]" + PCRE_requires= + if test -r ${with_pcre_dir}/META >/dev/null 2>&1; then + # Grab version + PCRE_version=`cat "${with_pcre_dir}/META" | grep version | cut -d'=' -f 2 | tr -d ' ' | tr -d '"' | head -n 1` + if test -z "" ; then + VERSION_OK=yes + else + as_arg_v1=${PCRE_version} +as_arg_v2= +awk "$as_awk_strverscmp" v1="$as_arg_v1" v2="$as_arg_v2" /dev/null +case $? in #( + 1) : + VERSION_OK= ;; #( + 0) : + VERSION_OK=yes ;; #( + 2) : + VERSION_OK=yes ;; #( + *) : + ;; +esac +fi + if test -z "${VERSION_OK}"; then + as_fn_error $? "requires version >= found ${PCRE_version}." "$LINENO" 5 + PCRE_STOP_CHECK=yes + fi + PCRE_requires=`cat "${with_pcre_dir}/META" | grep 'requires' | cut -d '=' -f 2 | tr -d '"'` + PCRE_path="${with_pcre_dir}" + else + PCRE_path=`${OCAMLFIND} -query pcre 2>/dev/null` + if ! test -z ""; then + as_fn_error $? "cannot find version from META file." "$LINENO" 5 + PCRE_STOP_CHECK=yes + fi + fi + if test -z "${PCRE_STOP_CHECK}"; then + PCRE_PACKAGES="`${OCAMLFIND} query -separator " " -format "-package %p" $BINGING_PKGS 2>/dev/null`" + echo ${with_pcre_dir} | grep ^/ > /dev/null 2>&1 \ + || with_pcre_dir=${PWD}/${with_pcre_dir} + if test -z "${PCRE_SHARED}"; then + liquidsoap_ocamlcflags="${liquidsoap_ocamlcflags} -I ${with_pcre_dir} ${PCRE_PACKAGES}" + else + pcre_ocamlcflags="-I ${with_pcre_dir} ${PCRE_PACKAGES}" + fi + # We need to recurse here because + # some package may not be registered using ocamlfind + if test -n ""; then + PCRE_CMA=.${cma} + else + PCRE_CMA=pcre.${cma} + fi + for i in ${PCRE_requires}; do + PCRE_PACKAGES="${PCRE_PACKAGES} `${OCAMLFIND} query -separator " " -format "-package %p" $i 2>/dev/null`" + done + if test -z "${PCRE_SHARED}"; then + liquidsoap_ocamllflags="${liquidsoap_ocamllflags} ${PCRE_PACKAGES} ${PCRE_CMA}" + W_PCRE=yes + else + pcre_ocamllflags="${PCRE_PACKAGES} ${PCRE_CMA}" + W_PCRE=pcre + fi + LIBS_VERSIONS="${LIBS_VERSIONS} pcre=$PCRE_version" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } + fi + fi +fi + + +if test -z "${W_PCRE}" ; then + w_PCRE="no (requires pcre)" +else + if test -z "${PCRE_SHARED}"; then + w_PCRE=yes + else + PLUGINS_DATA="$PLUGINS_DATA +pcre_ocamlcflags=${pcre_ocamlcflags} +pcre_ocamllflags=${pcre_ocamllflags} +pcre_packages=${pcre_packages}" + w_PCRE=plugin + fi +fi +INC="$INC `$OCAMLFIND query pcre`" + + + + + + +if test -n ""; then + BINDING_PKGS="" +else + BINDING_PKGS="bytes" +fi + + +# Check whether --with-bytes-dir was given. +if test "${with_bytes_dir+set}" = set; then : + withval=$with_bytes_dir; +fi + + +# Check whether --enable-bytes-dynamic-plugin was given. +if test "${enable_bytes_dynamic_plugin+set}" = set; then : + enableval=$enable_bytes_dynamic_plugin; +fi + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ocaml bytes module" >&5 +$as_echo_n "checking for ocaml bytes module... " >&6; } + +OCAML_CHECK="${OCAMLFIND} query bytes" + + +if test "x$enable_bytes_dynamic_plugin" = "xyes" ; then + BYTES_SHARED="yes" + PLUGINS="$PLUGINS bytes" +fi + + +DEPS_CHECK=yes +for i in ; do + eval "dep_check=\$W_$i" + if test -z "${dep_check}"; then + DEPS_CHECK= + break + fi +done +if test -z $DEPS_CHECK; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: bytes needs " >&5 +$as_echo "bytes needs " >&6; } +else + if test -z "${with_bytes_dir}" ; then + if ! ${OCAML_CHECK} > /dev/null 2>&1 ; then + as_fn_error $? "Not found." "$LINENO" 5 + else + BYTES_version="`${OCAMLFIND} query -format "%v" bytes 2>/dev/null`" + if test -z "" ; then + VERSION_OK=yes + else + as_arg_v1=${BYTES_version} +as_arg_v2= +awk "$as_awk_strverscmp" v1="$as_arg_v1" v2="$as_arg_v2" /dev/null +case $? in #( + 1) : + VERSION_OK= ;; #( + 0) : + VERSION_OK=yes ;; #( + 2) : + VERSION_OK=yes ;; #( + *) : + ;; +esac +fi + if test -z "${VERSION_OK}"; then + as_fn_error $? "requires version >= found ${BYTES_version}." "$LINENO" 5 + else + if test -z "${BYTES_SHARED}"; then + BYTES_PACKAGES="`${OCAMLFIND} query -separator " " -format "-package %p" $BINDING_PKGS 2>/dev/null`" + liquidsoap_ocamlcflags="${liquidsoap_ocamlcflags} ${BYTES_PACKAGES}" + W_BYTES=yes + else + bytes_packages="`${OCAMLFIND} query -r -separator " " -format "%p" $BINDING_PKGS 2>/dev/null`" + W_BYTES=bytes + fi + LIBS_VERSIONS="${LIBS_VERSIONS} bytes=$BYTES_version" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } + fi + fi + else + BYTES_STOP_CHECK= + BYTES_version="[unknown version]" + BYTES_requires= + if test -r ${with_bytes_dir}/META >/dev/null 2>&1; then + # Grab version + BYTES_version=`cat "${with_bytes_dir}/META" | grep version | cut -d'=' -f 2 | tr -d ' ' | tr -d '"' | head -n 1` + if test -z "" ; then + VERSION_OK=yes + else + as_arg_v1=${BYTES_version} +as_arg_v2= +awk "$as_awk_strverscmp" v1="$as_arg_v1" v2="$as_arg_v2" /dev/null +case $? in #( + 1) : + VERSION_OK= ;; #( + 0) : + VERSION_OK=yes ;; #( + 2) : + VERSION_OK=yes ;; #( + *) : + ;; +esac +fi + if test -z "${VERSION_OK}"; then + as_fn_error $? "requires version >= found ${BYTES_version}." "$LINENO" 5 + BYTES_STOP_CHECK=yes + fi + BYTES_requires=`cat "${with_bytes_dir}/META" | grep 'requires' | cut -d '=' -f 2 | tr -d '"'` + BYTES_path="${with_bytes_dir}" + else + BYTES_path=`${OCAMLFIND} -query bytes 2>/dev/null` + if ! test -z ""; then + as_fn_error $? "cannot find version from META file." "$LINENO" 5 + BYTES_STOP_CHECK=yes + fi + fi + if test -z "${BYTES_STOP_CHECK}"; then + BYTES_PACKAGES="`${OCAMLFIND} query -separator " " -format "-package %p" $BINGING_PKGS 2>/dev/null`" + echo ${with_bytes_dir} | grep ^/ > /dev/null 2>&1 \ + || with_bytes_dir=${PWD}/${with_bytes_dir} + if test -z "${BYTES_SHARED}"; then + liquidsoap_ocamlcflags="${liquidsoap_ocamlcflags} -I ${with_bytes_dir} ${BYTES_PACKAGES}" + else + bytes_ocamlcflags="-I ${with_bytes_dir} ${BYTES_PACKAGES}" + fi + # We need to recurse here because + # some package may not be registered using ocamlfind + if test -n ""; then + BYTES_CMA=.${cma} + else + BYTES_CMA=bytes.${cma} + fi + for i in ${BYTES_requires}; do + BYTES_PACKAGES="${BYTES_PACKAGES} `${OCAMLFIND} query -separator " " -format "-package %p" $i 2>/dev/null`" + done + if test -z "${BYTES_SHARED}"; then + liquidsoap_ocamllflags="${liquidsoap_ocamllflags} ${BYTES_PACKAGES} ${BYTES_CMA}" + W_BYTES=yes + else + bytes_ocamllflags="${BYTES_PACKAGES} ${BYTES_CMA}" + W_BYTES=bytes + fi + LIBS_VERSIONS="${LIBS_VERSIONS} bytes=$BYTES_version" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } + fi + fi +fi + + +if test -z "${W_BYTES}" ; then + w_BYTES="no (requires bytes)" +else + if test -z "${BYTES_SHARED}"; then + w_BYTES=yes + else + PLUGINS_DATA="$PLUGINS_DATA +bytes_ocamlcflags=${bytes_ocamlcflags} +bytes_ocamllflags=${bytes_ocamllflags} +bytes_packages=${bytes_packages}" + w_BYTES=plugin + fi +fi +INC="$INC `$OCAMLFIND query bytes`" + + + + + + +if test -n ""; then + BINDING_PKGS="" +else + BINDING_PKGS="ssl" +fi + + +# Check whether --with-ssl-dir was given. +if test "${with_ssl_dir+set}" = set; then : + withval=$with_ssl_dir; +fi + + +# Check whether --enable-ssl-dynamic-plugin was given. +if test "${enable_ssl_dynamic_plugin+set}" = set; then : + enableval=$enable_ssl_dynamic_plugin; +fi + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ocaml ssl module" >&5 +$as_echo_n "checking for ocaml ssl module... " >&6; } + +OCAML_CHECK="${OCAMLFIND} query ssl" + + +if test "x$enable_ssl_dynamic_plugin" = "xyes" ; then + SSL_SHARED="yes" + PLUGINS="$PLUGINS ssl" +fi + + +DEPS_CHECK=yes +for i in ; do + eval "dep_check=\$W_$i" + if test -z "${dep_check}"; then + DEPS_CHECK= + break + fi +done +if test -z $DEPS_CHECK; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ssl needs " >&5 +$as_echo "ssl needs " >&6; } +else + if test -z "${with_ssl_dir}" ; then + if ! ${OCAML_CHECK} > /dev/null 2>&1 ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: Not found." >&5 +$as_echo "Not found." >&6; } + else + SSL_version="`${OCAMLFIND} query -format "%v" ssl 2>/dev/null`" + if test -z "" ; then + VERSION_OK=yes + else + as_arg_v1=${SSL_version} +as_arg_v2= +awk "$as_awk_strverscmp" v1="$as_arg_v1" v2="$as_arg_v2" /dev/null +case $? in #( + 1) : + VERSION_OK= ;; #( + 0) : + VERSION_OK=yes ;; #( + 2) : + VERSION_OK=yes ;; #( + *) : + ;; +esac +fi + if test -z "${VERSION_OK}"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: requires version >= found ${SSL_version}." >&5 +$as_echo "requires version >= found ${SSL_version}." >&6; } + else + if test -z "${SSL_SHARED}"; then + SSL_PACKAGES="`${OCAMLFIND} query -separator " " -format "-package %p" $BINDING_PKGS 2>/dev/null`" + liquidsoap_ocamlcflags="${liquidsoap_ocamlcflags} ${SSL_PACKAGES}" + W_SSL=yes + else + ssl_packages="`${OCAMLFIND} query -r -separator " " -format "%p" $BINDING_PKGS 2>/dev/null`" + W_SSL=ssl + fi + LIBS_VERSIONS="${LIBS_VERSIONS} ssl=$SSL_version" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } + fi + fi + else + SSL_STOP_CHECK= + SSL_version="[unknown version]" + SSL_requires= + if test -r ${with_ssl_dir}/META >/dev/null 2>&1; then + # Grab version + SSL_version=`cat "${with_ssl_dir}/META" | grep version | cut -d'=' -f 2 | tr -d ' ' | tr -d '"' | head -n 1` + if test -z "" ; then + VERSION_OK=yes + else + as_arg_v1=${SSL_version} +as_arg_v2= +awk "$as_awk_strverscmp" v1="$as_arg_v1" v2="$as_arg_v2" /dev/null +case $? in #( + 1) : + VERSION_OK= ;; #( + 0) : + VERSION_OK=yes ;; #( + 2) : + VERSION_OK=yes ;; #( + *) : + ;; +esac +fi + if test -z "${VERSION_OK}"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: requires version >= found ${SSL_version}." >&5 +$as_echo "requires version >= found ${SSL_version}." >&6; } + SSL_STOP_CHECK=yes + fi + SSL_requires=`cat "${with_ssl_dir}/META" | grep 'requires' | cut -d '=' -f 2 | tr -d '"'` + SSL_path="${with_ssl_dir}" + else + SSL_path=`${OCAMLFIND} -query ssl 2>/dev/null` + if ! test -z ""; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: cannot find version from META file." >&5 +$as_echo "cannot find version from META file." >&6; } + SSL_STOP_CHECK=yes + fi + fi + if test -z "${SSL_STOP_CHECK}"; then + SSL_PACKAGES="`${OCAMLFIND} query -separator " " -format "-package %p" $BINGING_PKGS 2>/dev/null`" + echo ${with_ssl_dir} | grep ^/ > /dev/null 2>&1 \ + || with_ssl_dir=${PWD}/${with_ssl_dir} + if test -z "${SSL_SHARED}"; then + liquidsoap_ocamlcflags="${liquidsoap_ocamlcflags} -I ${with_ssl_dir} ${SSL_PACKAGES}" + else + ssl_ocamlcflags="-I ${with_ssl_dir} ${SSL_PACKAGES}" + fi + # We need to recurse here because + # some package may not be registered using ocamlfind + if test -n ""; then + SSL_CMA=.${cma} + else + SSL_CMA=ssl.${cma} + fi + for i in ${SSL_requires}; do + SSL_PACKAGES="${SSL_PACKAGES} `${OCAMLFIND} query -separator " " -format "-package %p" $i 2>/dev/null`" + done + if test -z "${SSL_SHARED}"; then + liquidsoap_ocamllflags="${liquidsoap_ocamllflags} ${SSL_PACKAGES} ${SSL_CMA}" + W_SSL=yes + else + ssl_ocamllflags="${SSL_PACKAGES} ${SSL_CMA}" + W_SSL=ssl + fi + LIBS_VERSIONS="${LIBS_VERSIONS} ssl=$SSL_version" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } + fi + fi +fi + + +if test -z "${W_SSL}" ; then + w_SSL="no (requires ssl)" +else + if test -z "${SSL_SHARED}"; then + w_SSL=yes + else + PLUGINS_DATA="$PLUGINS_DATA +ssl_ocamlcflags=${ssl_ocamlcflags} +ssl_ocamllflags=${ssl_ocamllflags} +ssl_packages=${ssl_packages}" + w_SSL=plugin + fi +fi + +if test "$w_SSL" == "yes"; then + INC="$INC `$OCAMLFIND query ssl`" + DUPPY_SSL="duppy_ssl" + DUPPY_SSL_META="package \"ssl\" ( + description = \"OCaml advanced scheduler (SSL module)\" + requires = \"duppy ssl\" + version=\"${VERSION}\" + archive(byte) = \"duppy_ssl.cma\" + archive(native) = \"duppy_ssl.cmxa\" +)" +fi + + + + + + + + +if test -n ""; then + BINDING_PKGS="" +else + BINDING_PKGS="osx-secure-transport" +fi + + +# Check whether --with-osx_secure_transport-dir was given. +if test "${with_osx_secure_transport_dir+set}" = set; then : + withval=$with_osx_secure_transport_dir; +fi + + +# Check whether --enable-osx-secure-transport-dynamic-plugin was given. +if test "${enable_osx_secure_transport_dynamic_plugin+set}" = set; then : + enableval=$enable_osx_secure_transport_dynamic_plugin; +fi + + + + +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for ocaml osx-secure-transport module" >&5 +$as_echo_n "checking for ocaml osx-secure-transport module... " >&6; } + +OCAML_CHECK="${OCAMLFIND} query osx-secure-transport" + + +if test "x$enable_osx_secure_transport_dynamic_plugin" = "xyes" ; then + OSX_SECURE_TRANSPORT_SHARED="yes" + PLUGINS="$PLUGINS osx_secure_transport" +fi + + +DEPS_CHECK=yes +for i in ; do + eval "dep_check=\$W_$i" + if test -z "${dep_check}"; then + DEPS_CHECK= + break + fi +done +if test -z $DEPS_CHECK; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: osx_secure_transport needs " >&5 +$as_echo "osx_secure_transport needs " >&6; } +else + if test -z "${with_osx_secure_transport_dir}" ; then + if ! ${OCAML_CHECK} > /dev/null 2>&1 ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: Not found." >&5 +$as_echo "Not found." >&6; } + else + OSX_SECURE_TRANSPORT_version="`${OCAMLFIND} query -format "%v" osx-secure-transport 2>/dev/null`" + if test -z "" ; then + VERSION_OK=yes + else + as_arg_v1=${OSX_SECURE_TRANSPORT_version} +as_arg_v2= +awk "$as_awk_strverscmp" v1="$as_arg_v1" v2="$as_arg_v2" /dev/null +case $? in #( + 1) : + VERSION_OK= ;; #( + 0) : + VERSION_OK=yes ;; #( + 2) : + VERSION_OK=yes ;; #( + *) : + ;; +esac +fi + if test -z "${VERSION_OK}"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: requires version >= found ${OSX_SECURE_TRANSPORT_version}." >&5 +$as_echo "requires version >= found ${OSX_SECURE_TRANSPORT_version}." >&6; } + else + if test -z "${OSX_SECURE_TRANSPORT_SHARED}"; then + OSX_SECURE_TRANSPORT_PACKAGES="`${OCAMLFIND} query -separator " " -format "-package %p" $BINDING_PKGS 2>/dev/null`" + liquidsoap_ocamlcflags="${liquidsoap_ocamlcflags} ${OSX_SECURE_TRANSPORT_PACKAGES}" + W_OSX_SECURE_TRANSPORT=yes + else + osx_secure_transport_packages="`${OCAMLFIND} query -r -separator " " -format "%p" $BINDING_PKGS 2>/dev/null`" + W_OSX_SECURE_TRANSPORT=osx_secure_transport + fi + LIBS_VERSIONS="${LIBS_VERSIONS} osx-secure-transport=$OSX_SECURE_TRANSPORT_version" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } + fi + fi + else + OSX_SECURE_TRANSPORT_STOP_CHECK= + OSX_SECURE_TRANSPORT_version="[unknown version]" + OSX_SECURE_TRANSPORT_requires= + if test -r ${with_osx_secure_transport_dir}/META >/dev/null 2>&1; then + # Grab version + OSX_SECURE_TRANSPORT_version=`cat "${with_osx_secure_transport_dir}/META" | grep version | cut -d'=' -f 2 | tr -d ' ' | tr -d '"' | head -n 1` + if test -z "" ; then + VERSION_OK=yes + else + as_arg_v1=${OSX_SECURE_TRANSPORT_version} +as_arg_v2= +awk "$as_awk_strverscmp" v1="$as_arg_v1" v2="$as_arg_v2" /dev/null +case $? in #( + 1) : + VERSION_OK= ;; #( + 0) : + VERSION_OK=yes ;; #( + 2) : + VERSION_OK=yes ;; #( + *) : + ;; +esac +fi + if test -z "${VERSION_OK}"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: requires version >= found ${OSX_SECURE_TRANSPORT_version}." >&5 +$as_echo "requires version >= found ${OSX_SECURE_TRANSPORT_version}." >&6; } + OSX_SECURE_TRANSPORT_STOP_CHECK=yes + fi + OSX_SECURE_TRANSPORT_requires=`cat "${with_osx_secure_transport_dir}/META" | grep 'requires' | cut -d '=' -f 2 | tr -d '"'` + OSX_SECURE_TRANSPORT_path="${with_osx_secure_transport_dir}" + else + OSX_SECURE_TRANSPORT_path=`${OCAMLFIND} -query osx-secure-transport 2>/dev/null` + if ! test -z ""; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: cannot find version from META file." >&5 +$as_echo "cannot find version from META file." >&6; } + OSX_SECURE_TRANSPORT_STOP_CHECK=yes + fi + fi + if test -z "${OSX_SECURE_TRANSPORT_STOP_CHECK}"; then + OSX_SECURE_TRANSPORT_PACKAGES="`${OCAMLFIND} query -separator " " -format "-package %p" $BINGING_PKGS 2>/dev/null`" + echo ${with_osx_secure_transport_dir} | grep ^/ > /dev/null 2>&1 \ + || with_osx_secure_transport_dir=${PWD}/${with_osx_secure_transport_dir} + if test -z "${OSX_SECURE_TRANSPORT_SHARED}"; then + liquidsoap_ocamlcflags="${liquidsoap_ocamlcflags} -I ${with_osx_secure_transport_dir} ${OSX_SECURE_TRANSPORT_PACKAGES}" + else + osx_secure_transport_ocamlcflags="-I ${with_osx_secure_transport_dir} ${OSX_SECURE_TRANSPORT_PACKAGES}" + fi + # We need to recurse here because + # some package may not be registered using ocamlfind + if test -n ""; then + OSX_SECURE_TRANSPORT_CMA=.${cma} + else + OSX_SECURE_TRANSPORT_CMA=osx-secure-transport.${cma} + fi + for i in ${OSX_SECURE_TRANSPORT_requires}; do + OSX_SECURE_TRANSPORT_PACKAGES="${OSX_SECURE_TRANSPORT_PACKAGES} `${OCAMLFIND} query -separator " " -format "-package %p" $i 2>/dev/null`" + done + if test -z "${OSX_SECURE_TRANSPORT_SHARED}"; then + liquidsoap_ocamllflags="${liquidsoap_ocamllflags} ${OSX_SECURE_TRANSPORT_PACKAGES} ${OSX_SECURE_TRANSPORT_CMA}" + W_OSX_SECURE_TRANSPORT=yes + else + osx_secure_transport_ocamllflags="${OSX_SECURE_TRANSPORT_PACKAGES} ${OSX_SECURE_TRANSPORT_CMA}" + W_OSX_SECURE_TRANSPORT=osx_secure_transport + fi + LIBS_VERSIONS="${LIBS_VERSIONS} osx-secure-transport=$OSX_SECURE_TRANSPORT_version" + { $as_echo "$as_me:${as_lineno-$LINENO}: result: ok" >&5 +$as_echo "ok" >&6; } + fi + fi +fi + + +if test -z "${W_OSX_SECURE_TRANSPORT}" ; then + w_OSX_SECURE_TRANSPORT="no (requires osx-secure-transport)" +else + if test -z "${OSX_SECURE_TRANSPORT_SHARED}"; then + w_OSX_SECURE_TRANSPORT=yes + else + PLUGINS_DATA="$PLUGINS_DATA +osx_secure_transport_ocamlcflags=${osx_secure_transport_ocamlcflags} +osx_secure_transport_ocamllflags=${osx_secure_transport_ocamllflags} +osx_secure_transport_packages=${osx_secure_transport_packages}" + w_OSX_SECURE_TRANSPORT=plugin + fi +fi + +if test "$w_OSX_SECURE_TRANSPORT" == "yes"; then + INC="$INC `$OCAMLFIND query osx-secure-transport`" + DUPPY_SECURE_TRANSPORT="duppy_secure_transport" + DUPPY_SECURE_TRANSPORT_META="package \"secure_transport\" ( + description = \"OCaml advanced scheduler (SecureTransport module)\" + requires = \"duppy secure_transport\" + version=\"${VERSION}\" + archive(byte) = \"duppy_secure_transport.cma\" + archive(native) = \"duppy_secure_transport.cmxa\" +)" +fi + + + +# substitutions to perform +requires="unix threads pcre bigarray" + +ALL_INC="`ocamlfind query -r -separator " " $requires` $_INC" +INC="$INC $_INC" + + +all_requires="`ocamlfind query -r -separator " " -format "%p" $requires` $_requires" +requires="$requires $_requires" + + + +# Finally create the Makefile and samples +ac_config_files="$ac_config_files Makefile" + +ac_config_files="$ac_config_files src/META" + +ac_config_files="$ac_config_files src/Makefile" + +ac_config_files="$ac_config_files examples/Makefile.telnet" + +ac_config_files="$ac_config_files examples/Makefile.http" + +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}' + +# Transform confdefs.h into DEFS. +# Protect against shell expansion while executing Makefile rules. +# Protect against Makefile macro expansion. +# +# If the first sed substitution is executed (which looks for macros that +# take arguments), then branch to the quote section. Otherwise, +# look for a macro that doesn't take arguments. +ac_script=' +:mline +/\\$/{ + N + s,\\\n,, + b mline +} +t clear +:clear +s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g +t quote +s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g +t quote +b any +:quote +s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g +s/\[/\\&/g +s/\]/\\&/g +s/\$/$$/g +H +:any +${ + g + s/^\n// + s/\n/ /g + p +} +' +DEFS=`sed -n "$ac_script" confdefs.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 + + + +: "${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 ocaml-duppy $as_me 0.8.0, 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 + + + +cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 +# Files that config.status was made for. +config_files="$ac_config_files" + +_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 + +Configuration files: +$config_files + +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="\\ +ocaml-duppy config.status 0.8.0 +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' +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;; + --he | --h | --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 +_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 + "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "src/META") CONFIG_FILES="$CONFIG_FILES src/META" ;; + "src/Makefile") CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; + "examples/Makefile.telnet") CONFIG_FILES="$CONFIG_FILES examples/Makefile.telnet" ;; + "examples/Makefile.http") CONFIG_FILES="$CONFIG_FILES examples/Makefile.http" ;; + + *) 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 +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" + + +eval set X " :F $CONFIG_FILES " +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 +_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 +$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 + ;; + + + + esac + + + case $ac_file$ac_mode in + "Makefile":F) chmod a-w Makefile ;; + + 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..34f56d1 --- /dev/null +++ b/configure.ac @@ -0,0 +1,65 @@ +AC_INIT([ocaml-duppy],[0.8.0],[savonet-users@lists.sourceforge.net]) + +VERSION=$PACKAGE_VERSION +AC_SUBST(VERSION) +AC_MSG_RESULT([configuring $PACKAGE_STRING]) + +AC_BASE_CHECKS() + +AC_CHECK_OCAML_BINDING([pcre],[],[],[1]) +INC="$INC `$OCAMLFIND query pcre`" + +AC_CHECK_OCAML_BINDING([bytes],[],[],[1]) +INC="$INC `$OCAMLFIND query bytes`" + +AC_CHECK_OCAML_BINDING([ssl]) + +if test "$w_SSL" == "yes"; then + INC="$INC `$OCAMLFIND query ssl`" + DUPPY_SSL="duppy_ssl" + DUPPY_SSL_META="package \"ssl\" ( + description = \"OCaml advanced scheduler (SSL module)\" + requires = \"duppy ssl\" + version=\"${VERSION}\" + archive(byte) = \"duppy_ssl.cma\" + archive(native) = \"duppy_ssl.cmxa\" +)" +fi +AC_SUBST(DUPPY_SSL) +AC_SUBST(DUPPY_SSL_META) + +AC_CHECK_OCAML_BINDING([osx-secure-transport]) + +if test "$w_OSX_SECURE_TRANSPORT" == "yes"; then + INC="$INC `$OCAMLFIND query osx-secure-transport`" + DUPPY_SECURE_TRANSPORT="duppy_secure_transport" + DUPPY_SECURE_TRANSPORT_META="package \"secure_transport\" ( + description = \"OCaml advanced scheduler (SecureTransport module)\" + requires = \"duppy secure_transport\" + version=\"${VERSION}\" + archive(byte) = \"duppy_secure_transport.cma\" + archive(native) = \"duppy_secure_transport.cmxa\" +)" +fi +AC_SUBST(DUPPY_SECURE_TRANSPORT) +AC_SUBST(DUPPY_SECURE_TRANSPORT_META) + +# substitutions to perform +requires="unix threads pcre bigarray" +AC_SUBST(VERSION) +ALL_INC="`ocamlfind query -r -separator " " $requires` $_INC" +INC="$INC $_INC" +AC_SUBST(INC) +AC_SUBST(ALL_INC) +all_requires="`ocamlfind query -r -separator " " -format "%p" $requires` $_requires" +requires="$requires $_requires" +AC_SUBST(requires) +AC_SUBST(all_requires) + +# Finally create the Makefile and samples +AC_CONFIG_FILES([Makefile],[chmod a-w Makefile]) +AC_CONFIG_FILES([src/META]) +AC_CONFIG_FILES([src/Makefile]) +AC_CONFIG_FILES([examples/Makefile.telnet]) +AC_CONFIG_FILES([examples/Makefile.http]) +AC_OUTPUT diff --git a/examples/Makefile b/examples/Makefile new file mode 100644 index 0000000..2b9d33d --- /dev/null +++ b/examples/Makefile @@ -0,0 +1,12 @@ +# OCaml-Lastfm examples. +# +# Copyright 2007 by the Savonet team. +# +# $Id: Makefile 4694 2007-10-23 23:33:11Z smimram $ + +all clean: + $(MAKE) -f Makefile.telnet $@ + $(MAKE) -f Makefile.http $@ + +distclean: clean + rm -rf autom4te.cache config.log config.status autom4te.cache diff --git a/examples/Makefile.http.in b/examples/Makefile.http.in new file mode 100644 index 0000000..d560b96 --- /dev/null +++ b/examples/Makefile.http.in @@ -0,0 +1,12 @@ +SOURCES = http.ml +RESULT = http +INCDIRS = ../src @ALL_INC@ +OCAMLC = @OCAMLC@ -thread +OCAMLOPT = @OCAMLOPT@ -thread +LIBS = @all_requires@ duppy +PP = camlp4o -I ../src pa_duppy.cmo +export PP + +all: nc + +-include OCamlMakefile diff --git a/examples/Makefile.telnet.in b/examples/Makefile.telnet.in new file mode 100644 index 0000000..5cc1869 --- /dev/null +++ b/examples/Makefile.telnet.in @@ -0,0 +1,12 @@ +SOURCES = telnet.ml +RESULT = telnet +INCDIRS = ../src @ALL_INC@ +OCAMLC = @OCAMLC@ -thread +OCAMLOPT = @OCAMLOPT@ -thread +LIBS = @all_requires@ duppy +PP = camlp4o -I ../src pa_duppy.cmo +export PP + +all: nc + +-include OCamlMakefile diff --git a/examples/OCamlMakefile b/examples/OCamlMakefile new file mode 100644 index 0000000..6f62c91 --- /dev/null +++ b/examples/OCamlMakefile @@ -0,0 +1,1154 @@ +########################################################################### +# OCamlMakefile +# Copyright (C) 1999-2004 Markus Mottl +# +# For updates see: +# http://www.ocaml.info/home/ocaml_sources.html +# +# $Id: OCamlMakefile,v 1.72 2005/12/09 15:30:50 mottl Exp $ +# +########################################################################### + +# Modified by damien for .glade.ml compilation + +# Set these variables to the names of the sources to be processed and +# the result variable. Order matters during linkage! + +ifndef SOURCES + SOURCES := foo.ml +endif +export SOURCES + +ifndef RES_CLIB_SUF + RES_CLIB_SUF := _stubs +endif +export RES_CLIB_SUF + +ifndef RESULT + RESULT := foo +endif +export RESULT + +export LIB_PACK_NAME + +ifndef DOC_FILES + DOC_FILES := $(filter %.mli, $(SOURCES)) +endif +export DOC_FILES + +export BCSUFFIX +export NCSUFFIX + +ifndef TOPSUFFIX + TOPSUFFIX := .top +endif +export TOPSUFFIX + +# Eventually set include- and library-paths, libraries to link, +# additional compilation-, link- and ocamlyacc-flags +# Path- and library information needs not be written with "-I" and such... +# Define THREADS if you need it, otherwise leave it unset (same for +# USE_CAMLP4)! + +export THREADS +export VMTHREADS +export ANNOTATE +export USE_CAMLP4 + +export INCDIRS +export LIBDIRS +export EXTLIBDIRS +export RESULTDEPS +export OCAML_DEFAULT_DIRS + +export LIBS +export CLIBS + +export OCAMLFLAGS +export OCAMLNCFLAGS +export OCAMLBCFLAGS + +export OCAMLLDFLAGS +export OCAMLNLDFLAGS +export OCAMLBLDFLAGS + +ifndef OCAMLCPFLAGS + OCAMLCPFLAGS := a +endif + +export OCAMLCPFLAGS + +export PPFLAGS + +export YFLAGS +export IDLFLAGS + +export OCAMLDOCFLAGS + +export OCAMLFIND_INSTFLAGS + +export DVIPSFLAGS + +export STATIC + +# Add a list of optional trash files that should be deleted by "make clean" +export TRASH + +#################### variables depending on your OCaml-installation + +ifdef MINGW + export MINGW + WIN32 := 1 + CFLAGS_WIN32 := -mno-cygwin +endif +ifdef MSVC + export MSVC + WIN32 := 1 + ifndef STATIC + CPPFLAGS_WIN32 := -DCAML_DLL + endif + CFLAGS_WIN32 += -nologo + EXT_OBJ := obj + EXT_LIB := lib + ifeq ($(CC),gcc) + # work around GNU Make default value + ifdef THREADS + CC := cl -MT + else + CC := cl + endif + endif + ifeq ($(CXX),g++) + # work around GNU Make default value + CXX := $(CC) + endif + CFLAG_O := -Fo +endif +ifdef WIN32 + EXT_CXX := cpp + EXE := .exe +endif + +ifndef EXT_OBJ + EXT_OBJ := o +endif +ifndef EXT_LIB + EXT_LIB := a +endif +ifndef EXT_CXX + EXT_CXX := cc +endif +ifndef EXE + EXE := # empty +endif +ifndef CFLAG_O + CFLAG_O := -o # do not delete this comment (preserves trailing whitespace)! +endif + +export CC +export CXX +export CFLAGS +export CXXFLAGS +export LDFLAGS +export CPPFLAGS + +ifndef RPATH_FLAG + RPATH_FLAG := -R +endif +export RPATH_FLAG + +ifndef MSVC +ifndef PIC_CFLAGS + PIC_CFLAGS := -fPIC +endif +ifndef PIC_CPPFLAGS + PIC_CPPFLAGS := -DPIC +endif +endif + +export PIC_CFLAGS +export PIC_CPPFLAGS + +BCRESULT := $(addsuffix $(BCSUFFIX), $(RESULT)) +NCRESULT := $(addsuffix $(NCSUFFIX), $(RESULT)) +TOPRESULT := $(addsuffix $(TOPSUFFIX), $(RESULT)) + +ifndef OCAMLFIND + OCAMLFIND := ocamlfind +endif +export OCAMLFIND + +ifndef OCAMLC + OCAMLC := ocamlc +endif +export OCAMLC + +ifndef OCAMLOPT + OCAMLOPT := ocamlopt +endif +export OCAMLOPT + +ifndef OCAMLMKTOP + OCAMLMKTOP := ocamlmktop +endif +export OCAMLMKTOP + +ifndef OCAMLCP + OCAMLCP := ocamlcp +endif +export OCAMLCP + +ifndef OCAMLDEP + OCAMLDEP := ocamldep +endif +export OCAMLDEP + +ifndef OCAMLLEX + OCAMLLEX := ocamllex +endif +export OCAMLLEX + +ifndef OCAMLYACC + OCAMLYACC := ocamlyacc +endif +export OCAMLYACC + +ifndef OCAMLMKLIB + OCAMLMKLIB := ocamlmklib +endif +export OCAMLMKLIB + +ifndef OCAML_GLADECC + OCAML_GLADECC := lablgladecc2 +endif +export OCAML_GLADECC + +ifndef OCAML_GLADECC_FLAGS + OCAML_GLADECC_FLAGS := +endif +export OCAML_GLADECC_FLAGS + +ifndef CAMELEON_REPORT + CAMELEON_REPORT := report +endif +export CAMELEON_REPORT + +ifndef CAMELEON_REPORT_FLAGS + CAMELEON_REPORT_FLAGS := +endif +export CAMELEON_REPORT_FLAGS + +ifndef CAMELEON_ZOGGY + CAMELEON_ZOGGY := camlp4o pa_zog.cma pr_o.cmo +endif +export CAMELEON_ZOGGY + +ifndef CAMELEON_ZOGGY_FLAGS + CAMELEON_ZOGGY_FLAGS := +endif +export CAMELEON_ZOGGY_FLAGS + +ifndef OXRIDL + OXRIDL := oxridl +endif +export OXRIDL + +ifndef CAMLIDL + CAMLIDL := camlidl +endif +export CAMLIDL + +ifndef CAMLIDLDLL + CAMLIDLDLL := camlidldll +endif +export CAMLIDLDLL + +ifndef NOIDLHEADER + MAYBE_IDL_HEADER := -header +endif +export NOIDLHEADER + +export NO_CUSTOM + +ifndef CAMLP4 + CAMLP4 := camlp4 +endif +export CAMLP4 + +ifndef REAL_OCAMLFIND + ifdef PACKS + ifndef CREATE_LIB + ifdef THREADS + PACKS += threads + endif + endif + empty := + space := $(empty) $(empty) + comma := , + ifdef PREDS + PRE_OCAML_FIND_PREDICATES := $(subst $(space),$(comma),$(PREDS)) + PRE_OCAML_FIND_PACKAGES := $(subst $(space),$(comma),$(PACKS)) + OCAML_FIND_PREDICATES := -predicates $(PRE_OCAML_FIND_PREDICATES) + # OCAML_DEP_PREDICATES := -syntax $(PRE_OCAML_FIND_PREDICATES) + OCAML_FIND_PACKAGES := $(OCAML_FIND_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES) + OCAML_DEP_PACKAGES := $(OCAML_DEP_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES) + else + OCAML_FIND_PACKAGES := -package $(subst $(space),$(comma),$(PACKS)) + OCAML_DEP_PACKAGES := + endif + OCAML_FIND_LINKPKG := -linkpkg + REAL_OCAMLFIND := $(OCAMLFIND) + endif +endif + +export OCAML_FIND_PACKAGES +export OCAML_DEP_PACKAGES +export OCAML_FIND_LINKPKG +export REAL_OCAMLFIND + +ifndef OCAMLDOC + OCAMLDOC := ocamldoc +endif +export OCAMLDOC + +ifndef LATEX + LATEX := latex +endif +export LATEX + +ifndef DVIPS + DVIPS := dvips +endif +export DVIPS + +ifndef PS2PDF + PS2PDF := ps2pdf +endif +export PS2PDF + +ifndef OCAMLMAKEFILE + OCAMLMAKEFILE := OCamlMakefile +endif +export OCAMLMAKEFILE + +ifndef OCAMLLIBPATH + OCAMLLIBPATH := \ + $(shell $(OCAMLC) 2>/dev/null -where || echo /usr/lib/ocaml) +endif +export OCAMLLIBPATH + +ifndef OCAML_LIB_INSTALL + OCAML_LIB_INSTALL := $(OCAMLLIBPATH)/contrib +endif +export OCAML_LIB_INSTALL + +########################################################################### + +#################### change following sections only if +#################### you know what you are doing! + +# delete target files when a build command fails +.PHONY: .DELETE_ON_ERROR +.DELETE_ON_ERROR: + +# for pedants using "--warn-undefined-variables" +export MAYBE_IDL +export REAL_RESULT +export CAMLIDLFLAGS +export THREAD_FLAG +export RES_CLIB +export MAKEDLL +export ANNOT_FLAG +export C_OXRIDL +export SUBPROJS +export CFLAGS_WIN32 +export CPPFLAGS_WIN32 + +INCFLAGS := + +SHELL := /bin/sh + +MLDEPDIR := ._d +BCDIDIR := ._bcdi +NCDIDIR := ._ncdi + +FILTER_EXTNS := %.mli %.ml %.mll %.mly %.idl %.oxridl %.c %.$(EXT_CXX) %.rep %.zog %.glade + +FILTERED := $(filter $(FILTER_EXTNS), $(SOURCES)) +SOURCE_DIRS := $(filter-out ./, $(sort $(dir $(FILTERED)))) + +FILTERED_REP := $(filter %.rep, $(FILTERED)) +DEP_REP := $(FILTERED_REP:%.rep=$(MLDEPDIR)/%.d) +AUTO_REP := $(FILTERED_REP:.rep=.ml) + +FILTERED_ZOG := $(filter %.zog, $(FILTERED)) +DEP_ZOG := $(FILTERED_ZOG:%.zog=$(MLDEPDIR)/%.d) +AUTO_ZOG := $(FILTERED_ZOG:.zog=.ml) + +FILTERED_GLADE := $(filter %.glade, $(FILTERED)) +DEP_GLADE := $(FILTERED_GLADE:%.glade=$(MLDEPDIR)/%.d) +AUTO_GLADE := $(FILTERED_GLADE:.glade=.ml) + +FILTERED_ML := $(filter %.ml, $(FILTERED)) +DEP_ML := $(FILTERED_ML:%.ml=$(MLDEPDIR)/%.d) + +FILTERED_MLI := $(filter %.mli, $(FILTERED)) +DEP_MLI := $(FILTERED_MLI:.mli=.di) + +FILTERED_MLL := $(filter %.mll, $(FILTERED)) +DEP_MLL := $(FILTERED_MLL:%.mll=$(MLDEPDIR)/%.d) +AUTO_MLL := $(FILTERED_MLL:.mll=.ml) + +FILTERED_MLY := $(filter %.mly, $(FILTERED)) +DEP_MLY := $(FILTERED_MLY:%.mly=$(MLDEPDIR)/%.d) $(FILTERED_MLY:.mly=.di) +AUTO_MLY := $(FILTERED_MLY:.mly=.mli) $(FILTERED_MLY:.mly=.ml) + +FILTERED_IDL := $(filter %.idl, $(FILTERED)) +DEP_IDL := $(FILTERED_IDL:%.idl=$(MLDEPDIR)/%.d) $(FILTERED_IDL:.idl=.di) +C_IDL := $(FILTERED_IDL:%.idl=%_stubs.c) +ifndef NOIDLHEADER + C_IDL += $(FILTERED_IDL:.idl=.h) +endif +OBJ_C_IDL := $(FILTERED_IDL:%.idl=%_stubs.$(EXT_OBJ)) +AUTO_IDL := $(FILTERED_IDL:.idl=.mli) $(FILTERED_IDL:.idl=.ml) $(C_IDL) + +FILTERED_OXRIDL := $(filter %.oxridl, $(FILTERED)) +DEP_OXRIDL := $(FILTERED_OXRIDL:%.oxridl=$(MLDEPDIR)/%.d) $(FILTERED_OXRIDL:.oxridl=.di) +AUTO_OXRIDL := $(FILTERED_OXRIDL:.oxridl=.mli) $(FILTERED_OXRIDL:.oxridl=.ml) $(C_OXRIDL) + +FILTERED_C_CXX := $(filter %.c %.$(EXT_CXX), $(FILTERED)) +OBJ_C_CXX := $(FILTERED_C_CXX:.c=.$(EXT_OBJ)) +OBJ_C_CXX := $(OBJ_C_CXX:.$(EXT_CXX)=.$(EXT_OBJ)) + +PRE_TARGETS += $(AUTO_MLL) $(AUTO_MLY) $(AUTO_IDL) $(AUTO_OXRIDL) $(AUTO_ZOG) $(AUTO_REP) $(AUTO_GLADE) + +ALL_DEPS := $(DEP_ML) $(DEP_MLI) $(DEP_MLL) $(DEP_MLY) $(DEP_IDL) $(DEP_OXRIDL) $(DEP_ZOG) $(DEP_REP) $(DEP_GLADE) + +MLDEPS := $(filter %.d, $(ALL_DEPS)) +MLIDEPS := $(filter %.di, $(ALL_DEPS)) +BCDEPIS := $(MLIDEPS:%.di=$(BCDIDIR)/%.di) +NCDEPIS := $(MLIDEPS:%.di=$(NCDIDIR)/%.di) + +ALLML := $(filter %.mli %.ml %.mll %.mly %.idl %.oxridl %.rep %.zog %.glade, $(FILTERED)) + +IMPLO_INTF := $(ALLML:%.mli=%.mli.__) +IMPLO_INTF := $(foreach file, $(IMPLO_INTF), \ + $(basename $(file)).cmi $(basename $(file)).cmo) +IMPLO_INTF := $(filter-out %.mli.cmo, $(IMPLO_INTF)) +IMPLO_INTF := $(IMPLO_INTF:%.mli.cmi=%.cmi) + +IMPLX_INTF := $(IMPLO_INTF:.cmo=.cmx) + +INTF := $(filter %.cmi, $(IMPLO_INTF)) +IMPL_CMO := $(filter %.cmo, $(IMPLO_INTF)) +IMPL_CMX := $(IMPL_CMO:.cmo=.cmx) +IMPL_ASM := $(IMPL_CMO:.cmo=.asm) +IMPL_S := $(IMPL_CMO:.cmo=.s) + +OBJ_LINK := $(OBJ_C_IDL) $(OBJ_C_CXX) +OBJ_FILES := $(IMPL_CMO:.cmo=.$(EXT_OBJ)) $(OBJ_LINK) + +EXECS := $(addsuffix $(EXE), \ + $(sort $(TOPRESULT) $(BCRESULT) $(NCRESULT))) +ifdef WIN32 + EXECS += $(BCRESULT).dll $(NCRESULT).dll +endif + +CLIB_BASE := $(RESULT)$(RES_CLIB_SUF) +ifneq ($(strip $(OBJ_LINK)),) + RES_CLIB := lib$(CLIB_BASE).$(EXT_LIB) +endif + +ifdef WIN32 +DLLSONAME := $(CLIB_BASE).dll +else +DLLSONAME := dll$(CLIB_BASE).so +endif + +NONEXECS := $(INTF) $(IMPL_CMO) $(IMPL_CMX) $(IMPL_ASM) $(IMPL_S) \ + $(OBJ_FILES) $(PRE_TARGETS) $(BCRESULT).cma $(NCRESULT).cmxa \ + $(NCRESULT).$(EXT_LIB) $(BCRESULT).cmi $(BCRESULT).cmo \ + $(NCRESULT).cmi $(NCRESULT).cmx $(NCRESULT).o \ + $(RES_CLIB) $(IMPL_CMO:.cmo=.annot) \ + $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(LIB_PACK_NAME).cmx $(LIB_PACK_NAME).o + +ifndef STATIC + NONEXECS += $(DLLSONAME) +endif + +ifndef LIBINSTALL_FILES + LIBINSTALL_FILES := $(RESULT).mli $(RESULT).cmi $(RESULT).cma \ + $(RESULT).cmxa $(RESULT).$(EXT_LIB) $(RES_CLIB) + ifndef STATIC + ifneq ($(strip $(OBJ_LINK)),) + LIBINSTALL_FILES += $(DLLSONAME) + endif + endif +endif + +export LIBINSTALL_FILES + +ifdef WIN32 + # some extra stuff is created while linking DLLs + NONEXECS += $(BCRESULT).$(EXT_LIB) $(BCRESULT).exp $(NCRESULT).exp $(CLIB_BASE).exp $(CLIB_BASE).lib +endif + +TARGETS := $(EXECS) $(NONEXECS) + +# If there are IDL-files +ifneq ($(strip $(FILTERED_IDL)),) + MAYBE_IDL := -cclib -lcamlidl +endif + +ifdef USE_CAMLP4 + CAMLP4PATH := \ + $(shell $(CAMLP4) -where 2>/dev/null || echo /usr/lib/camlp4) + INCFLAGS := -I $(CAMLP4PATH) + CINCFLAGS := -I$(CAMLP4PATH) +endif + +DINCFLAGS := $(INCFLAGS) $(SOURCE_DIRS:%=-I %) $(OCAML_DEFAULT_DIRS:%=-I %) +INCFLAGS := $(DINCFLAGS) $(INCDIRS:%=-I %) +CINCFLAGS += $(SOURCE_DIRS:%=-I%) $(INCDIRS:%=-I%) $(OCAML_DEFAULT_DIRS:%=-I%) + +ifndef MSVC +CLIBFLAGS += $(SOURCE_DIRS:%=-L%) $(LIBDIRS:%=-L%) \ + $(EXTLIBDIRS:%=-L%) $(EXTLIBDIRS:%=-Wl,$(RPATH_FLAG)%) \ + $(OCAML_DEFAULT_DIRS:%=-L%) +endif + +ifndef PROFILING + INTF_OCAMLC := $(OCAMLC) +else + ifndef THREADS + INTF_OCAMLC := $(OCAMLCP) -p $(OCAMLCPFLAGS) + else + # OCaml does not support profiling byte code + # with threads (yet), therefore we force an error. + ifndef REAL_OCAMLC + $(error Profiling of multithreaded byte code not yet supported by OCaml) + endif + INTF_OCAMLC := $(OCAMLC) + endif +endif + +ifndef MSVC +COMMON_LDFLAGS := $(LDFLAGS:%=-ccopt %) $(SOURCE_DIRS:%=-ccopt -L%) \ + $(LIBDIRS:%=-ccopt -L%) $(EXTLIBDIRS:%=-ccopt -L%) \ + $(EXTLIBDIRS:%=-ccopt -Wl,$(RPATH_FLAG)%) \ + $(OCAML_DEFAULT_DIRS:%=-ccopt -L%) +else +COMMON_LDFLAGS := -ccopt "/link -NODEFAULTLIB:LIBC $(LDFLAGS:%=%) $(SOURCE_DIRS:%=-LIBPATH:%) \ + $(LIBDIRS:%=-LIBPATH:%) $(EXTLIBDIRS:%=-LIBPATH:%) \ + $(OCAML_DEFAULT_DIRS:%=-LIBPATH:%) " +endif + +CLIBS_OPTS := $(CLIBS:%=-cclib -l%) +ifdef MSVC + ifndef STATIC + # MSVC libraries do not have 'lib' prefix + CLIBS_OPTS := $(CLIBS:%=-cclib %.lib) + endif +endif + +ifneq ($(strip $(OBJ_LINK)),) + ifdef CREATE_LIB + OBJS_LIBS := -cclib -l$(CLIB_BASE) $(CLIBS_OPTS) $(MAYBE_IDL) + else + OBJS_LIBS := $(OBJ_LINK) $(CLIBS_OPTS) $(MAYBE_IDL) + endif +else + OBJS_LIBS := $(CLIBS_OPTS) $(MAYBE_IDL) +endif + +# If we have to make byte-code +ifndef REAL_OCAMLC + BYTE_OCAML := y + + # EXTRADEPS is added dependencies we have to insert for all + # executable files we generate. Ideally it should be all of the + # libraries we use, but it's hard to find the ones that get searched on + # the path since I don't know the paths built into the compiler, so + # just include the ones with slashes in their names. + EXTRADEPS := $(addsuffix .cma,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i)))) + SPECIAL_OCAMLFLAGS := $(OCAMLBCFLAGS) + + REAL_OCAMLC := $(INTF_OCAMLC) + + REAL_IMPL := $(IMPL_CMO) + REAL_IMPL_INTF := $(IMPLO_INTF) + IMPL_SUF := .cmo + + DEPFLAGS := + MAKE_DEPS := $(MLDEPS) $(BCDEPIS) + + ifdef CREATE_LIB + override CFLAGS := $(PIC_CFLAGS) $(CFLAGS) + override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS) + ifndef STATIC + ifneq ($(strip $(OBJ_LINK)),) + MAKEDLL := $(DLLSONAME) + ALL_LDFLAGS := -dllib $(DLLSONAME) + endif + endif + endif + + ifndef NO_CUSTOM + ifneq "$(strip $(OBJ_LINK) $(THREADS) $(MAYBE_IDL) $(CLIBS))" "" + ALL_LDFLAGS += -custom + endif + endif + + ALL_LDFLAGS += $(INCFLAGS) $(OCAMLLDFLAGS) $(OCAMLBLDFLAGS) \ + $(COMMON_LDFLAGS) $(LIBS:%=%.cma) + CAMLIDLDLLFLAGS := + + ifdef THREADS + ifdef VMTHREADS + THREAD_FLAG := -vmthread + else + THREAD_FLAG := -thread + endif + ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS) + ifndef CREATE_LIB + ifndef REAL_OCAMLFIND + ALL_LDFLAGS := unix.cma threads.cma $(ALL_LDFLAGS) + endif + endif + endif + +# we have to make native-code +else + EXTRADEPS := $(addsuffix .cmxa,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i)))) + ifndef PROFILING + SPECIAL_OCAMLFLAGS := $(OCAMLNCFLAGS) + PLDFLAGS := + else + SPECIAL_OCAMLFLAGS := -p $(OCAMLNCFLAGS) + PLDFLAGS := -p + endif + + REAL_IMPL := $(IMPL_CMX) + REAL_IMPL_INTF := $(IMPLX_INTF) + IMPL_SUF := .cmx + + override CPPFLAGS := -DNATIVE_CODE $(CPPFLAGS) + + DEPFLAGS := -native + MAKE_DEPS := $(MLDEPS) $(NCDEPIS) + + ALL_LDFLAGS := $(PLDFLAGS) $(INCFLAGS) $(OCAMLLDFLAGS) \ + $(OCAMLNLDFLAGS) $(COMMON_LDFLAGS) + CAMLIDLDLLFLAGS := -opt + + ifndef CREATE_LIB + ALL_LDFLAGS += $(LIBS:%=%.cmxa) + else + override CFLAGS := $(PIC_CFLAGS) $(CFLAGS) + override CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS) + endif + + ifdef THREADS + THREAD_FLAG := -thread + ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS) + ifndef CREATE_LIB + ifndef REAL_OCAMLFIND + ALL_LDFLAGS := unix.cmxa threads.cmxa $(ALL_LDFLAGS) + endif + endif + endif +endif + +export MAKE_DEPS + +ifdef ANNOTATE + ANNOT_FLAG := -dtypes +else +endif + +ALL_OCAMLCFLAGS := $(THREAD_FLAG) $(ANNOT_FLAG) $(OCAMLFLAGS) \ + $(INCFLAGS) $(SPECIAL_OCAMLFLAGS) + +ifdef make_deps + -include $(MAKE_DEPS) + PRE_TARGETS := +endif + +########################################################################### +# USER RULES + +# Call "OCamlMakefile QUIET=" to get rid of all of the @'s. +QUIET=@ + +# generates byte-code (default) +byte-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \ + REAL_RESULT="$(BCRESULT)" make_deps=yes +bc: byte-code + +byte-code-nolink: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \ + REAL_RESULT="$(BCRESULT)" make_deps=yes +bcnl: byte-code-nolink + +top: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(TOPRESULT) \ + REAL_RESULT="$(BCRESULT)" make_deps=yes + +# generates native-code + +native-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + make_deps=yes +nc: native-code + +native-code-nolink: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + make_deps=yes +ncnl: native-code-nolink + +# generates byte-code libraries +byte-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(BCRESULT).cma \ + REAL_RESULT="$(BCRESULT)" \ + CREATE_LIB=yes \ + make_deps=yes +bcl: byte-code-library + +# generates native-code libraries +native-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(NCRESULT).cmxa \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + CREATE_LIB=yes \ + make_deps=yes +ncl: native-code-library + +ifdef WIN32 +# generates byte-code dll +byte-code-dll: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(BCRESULT).dll \ + REAL_RESULT="$(BCRESULT)" \ + make_deps=yes +bcd: byte-code-dll + +# generates native-code dll +native-code-dll: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(NCRESULT).dll \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + make_deps=yes +ncd: native-code-dll +endif + +# generates byte-code with debugging information +debug-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \ + REAL_RESULT="$(BCRESULT)" make_deps=yes \ + OCAMLFLAGS="-g $(OCAMLFLAGS)" \ + OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)" +dc: debug-code + +debug-code-nolink: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \ + REAL_RESULT="$(BCRESULT)" make_deps=yes \ + OCAMLFLAGS="-g $(OCAMLFLAGS)" \ + OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)" +dcnl: debug-code-nolink + +# generates byte-code libraries with debugging information +debug-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(BCRESULT).cma \ + REAL_RESULT="$(BCRESULT)" make_deps=yes \ + CREATE_LIB=yes \ + OCAMLFLAGS="-g $(OCAMLFLAGS)" \ + OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)" +dcl: debug-code-library + +# generates byte-code for profiling +profiling-byte-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \ + REAL_RESULT="$(BCRESULT)" PROFILING="y" \ + make_deps=yes +pbc: profiling-byte-code + +# generates native-code + +profiling-native-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + PROFILING="y" \ + make_deps=yes +pnc: profiling-native-code + +# generates byte-code libraries +profiling-byte-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(BCRESULT).cma \ + REAL_RESULT="$(BCRESULT)" PROFILING="y" \ + CREATE_LIB=yes \ + make_deps=yes +pbcl: profiling-byte-code-library + +# generates native-code libraries +profiling-native-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(NCRESULT).cmxa \ + REAL_RESULT="$(NCRESULT)" PROFILING="y" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + CREATE_LIB=yes \ + make_deps=yes +pncl: profiling-native-code-library + +# packs byte-code objects +pack-byte-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT).cmo \ + REAL_RESULT="$(BCRESULT)" \ + PACK_LIB=yes make_deps=yes +pabc: pack-byte-code + +# packs native-code objects +pack-native-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(NCRESULT).cmx $(NCRESULT).o \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + PACK_LIB=yes make_deps=yes +panc: pack-native-code + +# generates HTML-documentation +htdoc: doc/$(RESULT)/html + +# generates Latex-documentation +ladoc: doc/$(RESULT)/latex + +# generates PostScript-documentation +psdoc: doc/$(RESULT)/latex/doc.ps + +# generates PDF-documentation +pdfdoc: doc/$(RESULT)/latex/doc.pdf + +# generates all supported forms of documentation +doc: htdoc ladoc psdoc pdfdoc + +########################################################################### +# LOW LEVEL RULES + +$(REAL_RESULT): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) \ + $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \ + $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@$(EXE) \ + $(REAL_IMPL) + +nolink: $(REAL_IMPL_INTF) $(OBJ_LINK) + +ifdef WIN32 +$(REAL_RESULT).dll: $(REAL_IMPL_INTF) $(OBJ_LINK) + $(CAMLIDLDLL) $(CAMLIDLDLLFLAGS) $(OBJ_LINK) $(CLIBS) \ + -o $@ $(REAL_IMPL) +endif + +%$(TOPSUFFIX): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) + $(REAL_OCAMLFIND) $(OCAMLMKTOP) \ + $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \ + $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@$(EXE) \ + $(REAL_IMPL) + +.SUFFIXES: .mli .ml .cmi .cmo .cmx .cma .cmxa .$(EXT_OBJ) \ + .mly .di .d .$(EXT_LIB) .idl %.oxridl .c .$(EXT_CXX) .h .so \ + .rep .zog .glade + +ifndef STATIC +ifdef MINGW +$(DLLSONAME): $(OBJ_LINK) + $(CC) $(CFLAGS) $(CFLAGS_WIN32) $(OBJ_LINK) -shared -o $@ \ + -Wl,--whole-archive $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/lib%.a))) \ + $(OCAMLLIBPATH)/ocamlrun.a \ + -Wl,--export-all-symbols \ + -Wl,--no-whole-archive +else +ifdef MSVC +$(DLLSONAME): $(OBJ_LINK) + link /NOLOGO /DLL /OUT:$@ $(OBJ_LINK) \ + $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/%.lib))) \ + $(OCAMLLIBPATH)/ocamlrun.lib + +else +$(DLLSONAME): $(OBJ_LINK) + $(OCAMLMKLIB) $(INCFLAGS) $(CLIBFLAGS) \ + -o $(CLIB_BASE) $(OBJ_LINK) $(CLIBS:%=-l%) \ + $(OCAMLMKLIB_FLAGS) +endif +endif +endif + +ifndef LIB_PACK_NAME +$(RESULT).cma: $(REAL_IMPL_INTF) $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(ALL_LDFLAGS) \ + $(OBJS_LIBS) -o $@ $(OCAMLBLDFLAGS) $(REAL_IMPL) + +$(RESULT).cmxa $(RESULT).$(EXT_LIB): $(REAL_IMPL_INTF) $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(ALL_LDFLAGS) $(OBJS_LIBS) \ + $(OCAMLNLDFLAGS) -o $@ $(REAL_IMPL) +else +ifdef BYTE_OCAML +$(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo: $(REAL_IMPL_INTF) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack -o $(LIB_PACK_NAME).cmo $(REAL_IMPL) +else +$(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx: $(REAL_IMPL_INTF) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack -o $(LIB_PACK_NAME).cmx $(REAL_IMPL) +endif + +$(RESULT).cma: $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(ALL_LDFLAGS) \ + $(OBJS_LIBS) -o $@ $(OCAMLBLDFLAGS) $(LIB_PACK_NAME).cmo + +$(RESULT).cmxa $(RESULT).$(EXT_LIB): $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(ALL_LDFLAGS) $(OBJS_LIBS) \ + $(OCAMLNLDFLAGS) -o $@ $(LIB_PACK_NAME).cmx +endif + +$(RES_CLIB): $(OBJ_LINK) +ifndef MSVC + ifneq ($(strip $(OBJ_LINK)),) + $(AR) rcs $@ $(OBJ_LINK) + endif +else + ifneq ($(strip $(OBJ_LINK)),) + lib -nologo -debugtype:cv -out:$(RES_CLIB) $(OBJ_LINK) + endif +endif + +.mli.cmi: $(EXTRADEPS) + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c $(THREAD_FLAG) $(ANNOT_FLAG) \ + $(OCAMLFLAGS) $(INCFLAGS) $<; \ + $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c $(THREAD_FLAG) $(ANNOT_FLAG) \ + $(OCAMLFLAGS) $(INCFLAGS) $<; \ + else \ + echo $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c -pp \"$$pp $(PPFLAGS)\" $(THREAD_FLAG) $(ANNOT_FLAG) \ + $(OCAMLFLAGS) $(INCFLAGS) $<; \ + $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c -pp "$$pp $(PPFLAGS)" $(THREAD_FLAG) $(ANNOT_FLAG) \ + $(OCAMLFLAGS) $(INCFLAGS) $<; \ + fi + +.ml.cmi .ml.$(EXT_OBJ) .ml.cmx .ml.cmo: $(EXTRADEPS) + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c $(ALL_OCAMLCFLAGS) $<; \ + $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c $(ALL_OCAMLCFLAGS) $<; \ + else \ + echo $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c -pp \"$$pp $(PPFLAGS)\" $(ALL_OCAMLCFLAGS) $<; \ + $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c -pp "$$pp $(PPFLAGS)" $(ALL_OCAMLCFLAGS) $<; \ + fi + +ifdef PACK_LIB +$(REAL_RESULT).cmo $(REAL_RESULT).cmx $(REAL_RESULT).o: $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack $(ALL_LDFLAGS) \ + $(OBJS_LIBS) -o $@ $(REAL_IMPL) +endif + +.PRECIOUS: %.ml +%.ml: %.mll + $(OCAMLLEX) $< + +.PRECIOUS: %.ml %.mli +%.ml %.mli: %.mly + $(OCAMLYACC) $(YFLAGS) $< + $(QUIET)pp=`sed -n -e 's/.*(\*pp \([^*]*\) \*).*/\1/p;q' $<`; \ + if [ ! -z "$$pp" ]; then \ + mv $*.ml $*.ml.temporary; \ + echo "(*pp $$pp $(PPFLAGS)*)" > $*.ml; \ + cat $*.ml.temporary >> $*.ml; \ + rm $*.ml.temporary; \ + mv $*.mli $*.mli.temporary; \ + echo "(*pp $$pp $(PPFLAGS)*)" > $*.mli; \ + cat $*.mli.temporary >> $*.mli; \ + rm $*.mli.temporary; \ + fi + + +.PRECIOUS: %.ml +%.ml: %.rep + $(CAMELEON_REPORT) $(CAMELEON_REPORT_FLAGS) -gen $< + +.PRECIOUS: %.ml +%.ml: %.zog + $(CAMELEON_ZOGGY) $(CAMELEON_ZOGGY_FLAGS) -impl $< > $@ + +.PRECIOUS: %.ml +%.ml: %.glade + $(OCAML_GLADECC) $(OCAML_GLADECC_FLAGS) $< > $@ + +.PRECIOUS: %.ml %.mli +%.ml %.mli: %.oxridl + $(OXRIDL) $< + +.PRECIOUS: %.ml %.mli %_stubs.c %.h +%.ml %.mli %_stubs.c %.h: %.idl + $(CAMLIDL) $(MAYBE_IDL_HEADER) $(IDLFLAGS) \ + $(CAMLIDLFLAGS) $< + $(QUIET)if [ $(NOIDLHEADER) ]; then touch $*.h; fi + +.c.$(EXT_OBJ): + $(OCAMLC) -c -cc "$(CC)" -ccopt "$(CFLAGS) \ + $(CPPFLAGS) $(CPPFLAGS_WIN32) \ + $(CFLAGS_WIN32) $(CINCFLAGS) $(CFLAG_O)$@ " $< + +.$(EXT_CXX).$(EXT_OBJ): + $(CXX) -c $(CXXFLAGS) $(CINCFLAGS) $(CPPFLAGS) \ + -I'$(OCAMLLIBPATH)' \ + $< $(CFLAG_O)$@ + +$(MLDEPDIR)/%.d: %.ml + $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ + $(DINCFLAGS) $< \> $@; \ + $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ + $(DINCFLAGS) $< > $@; \ + else \ + echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ + -pp \"$$pp $(PPFLAGS)\" $(DINCFLAGS) $< \> $@; \ + $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ + -pp "$$pp $(PPFLAGS)" $(DINCFLAGS) $< > $@; \ + fi + +$(BCDIDIR)/%.di $(NCDIDIR)/%.di: %.mli + $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(DINCFLAGS) $< \> $@; \ + $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(DINCFLAGS) $< > $@; \ + else \ + echo $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \ + -pp \"$$pp $(PPFLAGS)\" $(DINCFLAGS) $< \> $@; \ + $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \ + -pp "$$pp $(PPFLAGS)" $(DINCFLAGS) $< > $@; \ + fi + +doc/$(RESULT)/html: $(DOC_FILES) + rm -rf $@ + mkdir -p $@ + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(OCAMLDOC) -html -d $@ $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \ + $(OCAMLDOC) -html -d $@ $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \ + else \ + echo $(OCAMLDOC) -pp \"$$pp $(PPFLAGS)\" -html -d $@ $(OCAMLDOCFLAGS) \ + $(INCFLAGS) $(DOC_FILES); \ + $(OCAMLDOC) -pp "$$pp $(PPFLAGS)" -html -d $@ $(OCAMLDOCFLAGS) \ + $(INCFLAGS) $(DOC_FILES); \ + fi + +doc/$(RESULT)/latex: $(DOC_FILES) + rm -rf $@ + mkdir -p $@ + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(OCAMLDOC) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) \ + $(DOC_FILES) -o $@/doc.tex; \ + $(OCAMLDOC) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES) \ + -o $@/doc.tex; \ + else \ + echo $(OCAMLDOC) -pp \"$$pp $(PPFLAGS)\" -latex $(OCAMLDOCFLAGS) \ + $(INCFLAGS) $(DOC_FILES) -o $@/doc.tex; \ + $(OCAMLDOC) -pp "$$pp $(PPFLAGS)" -latex $(OCAMLDOCFLAGS) \ + $(INCFLAGS) $(DOC_FILES) -o $@/doc.tex; \ + fi + +doc/$(RESULT)/latex/doc.ps: doc/$(RESULT)/latex + cd doc/$(RESULT)/latex && \ + $(LATEX) doc.tex && \ + $(LATEX) doc.tex && \ + $(DVIPS) $(DVIPSFLAGS) doc.dvi -o $(@F) + +doc/$(RESULT)/latex/doc.pdf: doc/$(RESULT)/latex/doc.ps + cd doc/$(RESULT)/latex && $(PS2PDF) $( 1 then + (Printf.eprintf "Error: too many arguments\n"; exit 1) + else + files_path := s + in + Arg.parse + [ + "--non_blocking_queues", Arg.Int (fun i -> non_blocking_queues := i), + (Printf.sprintf + "Number of non-blocking queues. (default: %d)" !non_blocking_queues); + "--maybe_blocking_queues", Arg.Int (fun i -> maybe_blocking_queues := i), + (Printf.sprintf + "Number of maybe-blocking queues. (default: %d)" !maybe_blocking_queues) ; + "--port", Arg.Int (fun i -> port := i), + (Printf.sprintf + "Port used to bind the server. (default: %d)" !port) ; + ] arg usage ; + if !files_path = "" then + ( + Printf.printf "%s\n" usage; + exit 1 + ) + + +type priority = + Maybe_blocking + | Non_blocking + +let scheduler = Duppy.create () + +type http_method = Post | Get + +type http_protocol = Http_11 | Http_10 + +let string_of_protocol = + function + | Http_11 -> "HTTP/1.1" + | Http_10 -> "HTTP/1.0" + +let protocol_of_string = + function + | "HTTP/1.1" -> Http_11 + | "HTTP/1.0" -> Http_10 + | _ -> assert false + +let string_of_method = + function + | Post -> "POST" + | Get -> "GET" + +let method_of_string = + function + | "POST" -> Post + | "GET" -> Get + | _ -> assert false + +type data = None | String of string | File of Unix.file_descr + +type request = + { request_protocol : http_protocol ; + request_method : http_method ; + request_uri : string ; + request_headers : (string*string) list ; + request_data : data } + +type reply = + { reply_protocol : http_protocol ; + reply_status : int*string ; + reply_headers : (string*string) list ; + reply_data : data } + +exception Assoc of string + +let assoc_uppercase x y = + try + List.iter + (fun (l,v) -> if String.uppercase l = x then + raise (Assoc v)) y ; + raise Not_found + with + | Assoc s -> s + +let server = "dhttpd" + +let html_template = + Printf.sprintf + "\r\n\ + \r\n\ + %s" + +let server_error status protocol = + let (code,explanation) = status in + let data = + String + (html_template + (Printf.sprintf + "%s\r\n\ + %s !" explanation explanation)) + in + { reply_protocol = protocol ; + reply_status = status ; + reply_headers = [ "Content-Type","text/html; charset=UTF-8"; + "Server", server ] ; + reply_data = data } + +let error_404 = + server_error (404,"File Not Found") + +let error_500 = + server_error (500,"Bad Request") Http_10 + +let error_403 = + server_error (403,"Forbidden") + +let http_302 protocol uri = + { reply_protocol = protocol ; + reply_status = (302,"Found") ; + reply_headers = ["Location",uri]; + reply_data = String "" } + +type socket_status = Keep | Close + +let send_reply h reply = + let write s = + duppy_write + s + with + { priority = Non_blocking ; + handler = h } + in + let (code,status) = reply.reply_status in + let http_header = + Printf.sprintf + "%s %d %s\r\n\ + %s\r\n\ + \r\n" + (string_of_protocol reply.reply_protocol) code status + (String.concat "\r\n" + (List.map + (fun (x,y) -> + Printf.sprintf "%s: %s" x y) reply.reply_headers)) + in + duppy_do + write http_header ; + begin + match reply.reply_data with + | String s -> + write s + | File fd -> + let stats = Unix.fstat fd in + let ba = + Bigarray.Array1.map_file + fd Bigarray.char Bigarray.c_layout false + (stats.Unix.st_size) + in + let close () = + try + Unix.close fd + with + | _ -> () + in + let on_error e = + close () ; + h.Duppy.Monad.Io.on_error e + in + let h = + { h with + Duppy.Monad.Io. + on_error = on_error } + in + duppy_do + duppy_write_bigarray + ba + with + { priority = Non_blocking ; + handler = h } ; + duppy_return (close ()) + done + | None -> duppy_return () + end + done + +let parse_headers headers = + let split_header l h = + try + let rex = Pcre.regexp "([^:\\r\\n]+):\\s*([^\\r\\n]+)" in + let sub = Pcre.exec ~rex h in + duppy_return + ((Pcre.get_substring sub 1, + Pcre.get_substring sub 2) :: l) + with + | Not_found -> duppy_raise error_500 + in + duppy_fold_left split_header [] headers + +let index_uri path index protocol uri = + let uri = + try + let ret = + Pcre.extract ~rex:(Pcre.regexp "([^\\?]*)\\?") + uri + in + ret.(1) + with + | Not_found -> uri + in + try + if Sys.is_directory + (Printf.sprintf "%s%s" path uri) + then + if uri.[String.length uri - 1] <> '/' then + duppy_raise (http_302 protocol (Printf.sprintf "%s/" uri)) + else + begin + let index = Printf.sprintf "%s/%s" uri index in + if Sys.file_exists + (Printf.sprintf "%s/%s" path index) then + duppy_return index + else + duppy_return uri + end + else + duppy_return uri + with + | _ -> duppy_return uri + +let file_request path _ request = + let uri = + try + let ret = + Pcre.extract ~rex:(Pcre.regexp "([^\\?]*)\\?.*") + request.request_uri + in + ret.(1) + with + | Not_found -> request.request_uri + in + duppy uri = + index_uri path "index.html" + request.request_protocol uri + in + let fname = + Printf.sprintf "%s%s" path uri + in + if Sys.file_exists fname then + try + let fd = Unix.openfile fname [Unix.O_RDONLY] 0o640 in + let stats = Unix.fstat fd in + let headers = + [ "Server", server; + "Content-Length", string_of_int (stats.Unix.st_size) ] + in + let headers = + if Pcre.pmatch ~rex:(Pcre.regexp "\\.html$") fname then + ("Content-Type","text/html") :: headers + else if Pcre.pmatch ~rex:(Pcre.regexp "\\.css$") fname then + ("Content-Type","text/css") :: headers + else + headers + in + duppy_raise + { reply_protocol = request.request_protocol ; + reply_status = (200,"OK") ; + reply_headers = headers ; + reply_data = File fd } + with + | _ -> duppy_raise (error_403 request.request_protocol) + else + duppy_raise (error_404 request.request_protocol) + +let file_handler = + (fun _ -> duppy_return true),file_request !files_path + +let cgi_handler process path h request = + let uri,args,suffix = + try + let ret = + Pcre.extract ~rex:(Pcre.regexp "([^\\?]*)\\?(.*)") + request.request_uri + in + begin + try + let ans = + Pcre.extract ~rex:(Pcre.regexp "^([^/]*)/([^&=]*)$") + ret.(2) + in + ret.(1),ans.(1),ans.(2) + with + | Not_found -> ret.(1),ret.(2),"" + end + with + | Not_found -> request.request_uri,"","" + in + duppy script = + index_uri path "index.php" + request.request_protocol + uri + in + let script = + Printf.sprintf "%s%s" path script + in + let env = + Printf.sprintf + "export SERVER_SOFTWARE=Duppy-httpd/1.0; \ + export SERVER_NAME=localhost; \ + export GATEWAY_INTERFACE=CGI/1.1; \ + export SERVER_PROTOCOL=%s; \ + export SERVER_PORT=%d; \ + export REQUEST_METHOD=%s; \ + export REQUEST_URI=%s; \ + export REDIRECT_STATUS=200; \ + export SCRIPT_FILENAME=%s" + (string_of_protocol (request.request_protocol)) + !port + (string_of_method (request.request_method)) + (Filename.quote uri) + (Filename.quote script) + in + let env = + Printf.sprintf "%s; export QUERY_STRING=%s" + env + (Filename.quote args) + in + let env = + let tr_suffix = + Printf.sprintf "%s%s" path suffix + in + (* Trick ! *) + let tr_suffix = + Printf.sprintf "%s/%s" (Filename.dirname tr_suffix) + (Filename.basename tr_suffix) + in + Printf.sprintf "%s; export PATH_TRANSLATED=%s; \ + export PATH_INFO=%s" + env + (Filename.quote tr_suffix) + (Filename.quote suffix) + in + let sanitize s = + Pcre.replace ~pat:"-" ~templ:"_" (String.uppercase s) + in + let headers = + List.map (fun (x,y) -> (sanitize x,y)) request.request_headers + in + let append env key = + if List.mem_assoc key headers then + Printf.sprintf "%s; export %s=%s" + env key (Filename.quote (List.assoc key headers)) + else + env + in + let env = append env "CONTENT_TYPE" in + let env = append env "CONTENT_LENGTH" in + duppy env = + if List.mem_assoc "AUTHORIZATION" headers then + begin + let ret = + Pcre.extract ~rex:(Pcre.regexp "(^[^\\s]*\\s.*)$") + (List.assoc "AUTHORIZATION" headers) + in + if Array.length ret > 0 then + duppy_return (Printf.sprintf "%s; extract AUTH_TYPE=%s" env (ret.(1))) + else + duppy_raise error_500 + end + else + duppy_return env + in + let f env (x,y) = + Printf.sprintf "%s; export HTTP_%s=%s" + env x (Filename.quote y) + in + let env = List.fold_left f env headers in + let data = + match request.request_data with + | None -> "" + | String s -> s + | _ -> assert false (* not implemented *) + in + let process = + Printf.sprintf "%s; %s 2>/dev/null" + env process + in + let in_c,out_c = + Unix.open_process process + in + let out_s = + Unix.descr_of_out_channel out_c + in + let h = + { h with + Duppy.Monad.Io. + socket = out_s ; + data = "" + } + in + duppy () = + duppy_write + data + with + { priority = Non_blocking ; + handler = h } + in + let in_s = + Unix.descr_of_in_channel in_c + in + let h = + { h with + Duppy.Monad.Io. + socket = in_s ; + data = "" + } + in + duppy headers = + duppy_read + Duppy.Io.Split "[\r]?\n[\r]?\n" + with + { priority = Non_blocking ; + handler = h } + in + duppy data = + duppy_try + duppy_read_all + in_s + with + { priority = Non_blocking ; + scheduler = h.Duppy.Monad.Io.scheduler } + with + | (s,_) -> duppy_return s + in + let data = + Printf.sprintf "%s%s" h.Duppy.Monad.Io.data data + in + ignore(Unix.close_process (in_c,out_c)) ; + duppy headers = + let headers = Pcre.split ~pat:"\r\n" headers in + parse_headers headers + in + duppy status,headers = + if List.mem_assoc "Status" headers then + try + let ans = Pcre.extract ~rex:(Pcre.regexp "([\\d]+)\\s(.*)") + (List.assoc "Status" headers) + in + duppy_return + ((int_of_string ans.(1), + ans.(2)), + List.filter (fun (x,y) -> x <> "Status") headers) + with _ -> duppy_raise error_500 + else duppy_return ((200,"OK"),headers) + in + let headers = + ("Content-length",string_of_int (String.length data)):: + headers + in + duppy_raise + { reply_protocol = request.request_protocol ; + reply_status = status ; + reply_headers = headers ; + reply_data = String data } + +let php_handler = + (fun request -> + duppy uri = + index_uri !files_path "index.php" + request.request_protocol + request.request_uri + in + duppy_return (Pcre.pmatch ~rex:(Pcre.regexp "\\.php$") uri)), + cgi_handler "php-cgi" !files_path + +let handlers = [php_handler;file_handler] + +let handle_request h request = + let f (check,handler) = + duppy check = check request in + if check then + handler h request + else + duppy_return () + in + duppy_try + duppy_do + duppy_iter f handlers ; + duppy_return (error_404 request.request_protocol) + done + with + | reply -> duppy_return reply + +let parse_request h r = + try + let headers = Pcre.split ~pat:"\r\n" r in + duppy request,headers = + match headers with + | e :: l -> + duppy headers = + parse_headers l + in + duppy_return (e,headers) + | _ -> duppy_raise error_500 + in + let rex = Pcre.regexp "([\\w]+)\\s([^\\s]+)\\s(HTTP/1.[01])" in + duppy http_method,uri,protocol = + try + let sub = Pcre.exec ~rex request in + let http_method,uri,protocol = + Pcre.get_substring sub 1, + Pcre.get_substring sub 2, + Pcre.get_substring sub 3 + in + duppy_return + (method_of_string http_method, + uri, + protocol_of_string protocol) + with + | _ -> duppy_raise error_500 + in + duppy data = + match http_method with + | Get -> duppy_return None + | Post -> + duppy len = + try + let length = assoc_uppercase "CONTENT-LENGTH" headers in + duppy_return (int_of_string length) + with + | Not_found -> duppy_return 0 + | _ -> duppy_raise error_500 + in + match len with + | 0 -> duppy_return None + | d -> + duppy data = + duppy_read + Duppy.Io.Length d + with + { priority = Non_blocking ; + handler = h } + in + duppy_return (String data) + in + duppy_return + { request_method = http_method ; + request_protocol = protocol ; + request_uri = uri ; + request_headers = headers ; + request_data = data } + with + | _ -> duppy_raise error_500 + +let handle_client socket = + (* Read and process lines *) + let on_error e = + error_500 + in + let h = + { Duppy.Monad.Io. + scheduler = scheduler ; + socket = socket ; + data = ""; + on_error = on_error } + in + let rec exec () = + duppy (keep,reply) = + duppy_try + duppy data = + duppy_read + Duppy.Io.Split "\r\n\r\n" + with + { priority = Non_blocking ; + handler = h } + in + duppy request = + parse_request h data + in + duppy reply = + handle_request h request + in + let close_header headers = + try + (assoc_uppercase "CONNECTION" headers) = "close" + with + | Not_found -> false + in + let keep = + if + request.request_protocol = Http_10 || + close_header request.request_headers || + close_header reply.reply_headers + then + Close + else + Keep + in + duppy_return (keep,reply) + with + | reply -> duppy_return (Close,reply) + in + duppy_do + send_reply h reply ; + if keep = Keep then + exec () + else + duppy_return () + done + in + let finish _ = + try + Unix.close socket + with + | _ -> () + in + duppy_run + exec () + with + { return = finish ; + raise = finish } + +let new_queue ~priority ~name () = + let priorities p = p = priority in + let queue () = + Duppy.queue scheduler ~log:(fun _ -> ()) ~priorities name + in + Thread.create queue () + +let bind_addr_inet = Unix.inet_addr_of_string "0.0.0.0" +let bind_addr = Unix.ADDR_INET(bind_addr_inet, !port) +let max_conn = 100 +let sock = Unix.socket Unix.PF_INET Unix.SOCK_STREAM 0 +let () = + (* See http://caml.inria.fr/mantis/print_bug_page.php?bug_id=4640 + * for this: we want Unix EPIPE error and not SIGPIPE, which + * crashes the program.. *) + Sys.set_signal Sys.sigpipe Sys.Signal_ignore; + ignore (Unix.sigprocmask Unix.SIG_BLOCK [Sys.sigpipe]); + Unix.setsockopt sock Unix.SO_REUSEADDR true ; + let rec incoming _ = + begin + try + let (s,caller) = Unix.accept sock in + handle_client s + with e -> + Printf.printf "Failed to accept new client: %S\n" + (Printexc.to_string e) + end ; + [{ Duppy.Task. + priority = Non_blocking ; + events = [`Read sock] ; + handler = incoming }] + in + begin + try + Unix.bind sock bind_addr + with + | Unix.Unix_error(Unix.EADDRINUSE, "bind", "") -> + failwith (Printf.sprintf "port %d already taken" !port) + end ; + Unix.listen sock max_conn ; + Duppy.Task.add scheduler + { Duppy.Task. + priority = Non_blocking ; + events = [`Read sock] ; + handler = incoming } ; + for i = 1 to !non_blocking_queues do + ignore(new_queue ~priority:Non_blocking + ~name:(Printf.sprintf "Non blocking queue #%d" i) + ()) + done ; + for i = 1 to !maybe_blocking_queues do + ignore(new_queue ~priority:Maybe_blocking + ~name:(Printf.sprintf "Maybe blocking queue #%d" i) + ()) + done ; + Duppy.queue scheduler ~log:(fun _ -> ()) "root" diff --git a/examples/telnet.ml b/examples/telnet.ml new file mode 100644 index 0000000..f1e60a2 --- /dev/null +++ b/examples/telnet.ml @@ -0,0 +1,181 @@ +(*pp $PP *) + +type priority = Non_blocking | Maybe_blocking +let io_priority = Non_blocking + +(* Create scheduler *) +let scheduler = Duppy.create () + +(* Create two queues, + * one for non blocking events + * and another for blocking + * events *) +let new_queue ~priority ~name () = + let log = + Printf.printf "%s: %s\n%!" name + in + let priorities p = p = priority in + let queue () = + Duppy.queue scheduler ~log ~priorities name + in + Thread.create queue () + +let th = + ignore(new_queue ~priority:Non_blocking + ~name:"Non blocking queue" ()) ; + ignore(new_queue ~priority:Maybe_blocking + ~name:"Maybe blocking queue #1" ()) ; + new_queue ~priority:Maybe_blocking + ~name:"Maybe blocking queue #2" () + +let exec_command s () = + let chan = Unix.open_process_in s in + let rec aux () = + match + try Some (input_line chan) with End_of_file -> None + with + | None -> [] + | Some s -> s::(aux ()) + in + let l = aux () in + ignore (Unix.close_process_in chan) ; + duppy_return (String.concat "\r\n" l) + + +let commands = Hashtbl.create 10 +let () = Hashtbl.add commands "hello" (false,fun () -> duppy_return "world") ; + Hashtbl.add commands "foo" (false,fun () -> duppy_return "bar") ; + Hashtbl.add commands "uptime" (true,exec_command "uptime") ; + Hashtbl.add commands "date" (true,exec_command "date") ; + Hashtbl.add commands "whoami" (true,exec_command "whoami") ; + Hashtbl.add commands "sleep" (true,exec_command "sleep 15") ; + Hashtbl.add commands "exit" (true,fun () -> duppy_raise ()) +(* Add commands here *) +let help = Buffer.create 10 +let () = Buffer.add_string help "List of commands:" ; + Hashtbl.iter + (fun x _ -> Buffer.add_string help (Printf.sprintf "\r\n%s" x)) + commands ; + Hashtbl.add commands "help" (false,fun () -> duppy_return (Buffer.contents help)) + +let handle_client socket = + let on_error e = + match e with + | Duppy.Io.Io_error -> + Printf.printf "Client disconnected" + | Duppy.Io.Unix (c,p,m) -> + Printf.printf "%s" (Printexc.to_string + (Unix.Unix_error (c,p,m))) + | Duppy.Io.Unknown e -> + Printf.printf "%s" (Printexc.to_string e) + in + let h = + { Duppy.Monad.Io. + scheduler = scheduler ; + socket = socket ; + data = ""; + on_error = on_error } + in + (* Read and process lines *) + let rec exec () = + duppy req = + duppy_read + Duppy.Io.Split "[\r\n]+" + with + { priority = io_priority ; + handler = h } + in + duppy ans = + try + let blocking,command = Hashtbl.find commands req in + if not blocking then + command () + else + begin + duppy_exec + command () + with + { priority = Maybe_blocking ; + handler = h } + end + with + | Not_found -> + duppy_return "ERROR: unknown command, type \"help\" to get a \ + list of commands." + in + duppy_do + duppy_write + "BEGIN\r\n"; + ans; + "\r\nEND\r\n" + with + { priority = io_priority ; + handler = h } ; + exec () + done + in + let close () = + try + Unix.close socket + with + | _ -> () + in + let return () = + let on_error e = + on_error e ; + close () + in + Duppy.Io.write ~priority:io_priority + ~on_error + ~exec:close scheduler + ~string:"Bye!\r\n" socket + in + duppy_run + exec () + with + { return = return ; + raise = close } + +open Unix + +let port = 4123 +let bind_addr_inet = inet_addr_of_string "0.0.0.0" +let bind_addr = ADDR_INET(bind_addr_inet, port) +let max_conn = 10 +let sock = socket PF_INET SOCK_STREAM 0 + +let () = + setsockopt sock SO_REUSEADDR true ; + let rec incoming _ = + begin + try + let (s,caller) = accept sock in + let ip = + let a = match caller with + | ADDR_INET (a,_) -> a + | _ -> assert false + in + try + (gethostbyaddr a).h_name + with + | Not_found -> string_of_inet_addr a + in + Printf.printf "New client: %s\n" ip ; + handle_client s + with e -> + Printf.printf "Failed to accept new client: %S\n" (Printexc.to_string e) + end ; + [{ Duppy.Task.priority = io_priority ; + Duppy.Task.events = [`Read sock] ; + Duppy.Task.handler = incoming }] + in + begin try bind sock bind_addr with + | Unix.Unix_error(Unix.EADDRINUSE, "bind", "") -> + failwith (Printf.sprintf "port %d already taken" port) + end ; + listen sock max_conn ; + Duppy.Task.add scheduler + { Duppy.Task.priority = io_priority ; + Duppy.Task.events = [`Read sock] ; + Duppy.Task.handler = incoming } ; + Thread.join th diff --git a/install-sh b/install-sh new file mode 100755 index 0000000..8175c64 --- /dev/null +++ b/install-sh @@ -0,0 +1,518 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2018-03-11.20; # 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. + 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 + dstbase=`basename "$src"` + case $dst in + */) dst=$dst$dstbase;; + *) dst=$dst/$dstbase;; + esac + dstdir_status=0 + else + dstdir=`dirname "$dst"` + test -d "$dstdir" + dstdir_status=$? + fi + fi + + case $dstdir in + */) dstdirslash=$dstdir;; + *) dstdirslash=$dstdir/;; + esac + + 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. + ;; + *) + # Note that $RANDOM variable is not portable (e.g. dash); Use it + # here however when possible just to lower collision chance. + tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$ + + trap 'ret=$?; rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" 2>/dev/null; exit $ret' 0 + + # Because "mkdir -p" follows existing symlinks and we likely work + # directly in world-writeable /tmp, make sure that the '$tmpdir' + # directory is successfully created first before we actually test + # 'mkdir -p' feature. + if (umask $mkdir_umask && + $mkdirprog $mkdir_mode "$tmpdir" && + exec $mkdirprog $mkdir_mode -p -- "$tmpdir/a/b") >/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. + test_tmpdir="$tmpdir/a" + ls_ld_tmpdir=`ls -ld "$test_tmpdir"` + case $ls_ld_tmpdir in + d????-?r-*) different_mode=700;; + d????-?--*) different_mode=755;; + *) false;; + esac && + $mkdirprog -m$different_mode -p -- "$test_tmpdir" && { + ls_ld_tmpdir_1=`ls -ld "$test_tmpdir"` + test "$ls_ld_tmpdir" = "$ls_ld_tmpdir_1" + } + } + then posix_mkdir=: + fi + rmdir "$tmpdir/a/b" "$tmpdir/a" "$tmpdir" + else + # Remove any dirs left behind by ancient mkdir implementations. + rmdir ./$mkdir_mode ./-p ./-- "$tmpdir" 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=${dstdirslash}_inst.$$_ + rmtmp=${dstdirslash}_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 'before-save-hook 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-time-zone: "UTC0" +# time-stamp-end: "; # UTC" +# End: diff --git a/m4/base_checks.m4 b/m4/base_checks.m4 new file mode 100644 index 0000000..bfd98a2 --- /dev/null +++ b/m4/base_checks.m4 @@ -0,0 +1,175 @@ +AC_DEFUN([AC_BASE_CHECKS], +[AC_REQUIRE([AC_PROG_CC]) + +dnl check for base compilers +AC_CANONICAL_HOST() + +dnl Detect the target toolchain +AC_MSG_CHECKING([target toolchain]) +case "${host_os}" in + linux*) + TARGET_TOOLCHAIN="linux" + ;; + mingw*) + TARGET_TOOLCHAIN="mingw" + ;; + cygwin*) + TARGET_TOOLCHAIN="cygwin" + ;; + darwin*) + TARGET_TOOLCHAIN="darwin" + ;; + *) + TARGET_TOOLCHAIN="other" + ;; +esac +AC_MSG_RESULT([$TARGET_TOOLCHAIN]) +AC_SUBST(TARGET_TOOLCHAIN) + +# AC_CANONICAL_HOST needs those files +AUTOCONF_INSTALL_FILES="config.guess config.sub install-sh m4/*.m4" +AC_SUBST(AUTOCONF_INSTALL_FILES) + +AC_PROG_CC() +AC_PROG_INSTALL() +AC_CHECK_TOOL([AR],[ar],no) +AC_SUBST(AR) +AC_CHECK_OCAML_COMPILERS() + +dnl add some flags +AC_DETECT_PIC_FLAGS() + +CXXFLAGS="$CXXFLAGS $PIC_FLAGS" +CPPFLAGS="$CPPFLAGS $PIC_FLAGS" + +# Add prefix to compilation variables +# if passed +if test "x$prefix" != "xNONE"; then + CFLAGS="$CFLAGS -I$prefix/include" + LDFLAGS="$LDFLAGS -L$prefix/lib" + CPPFLAGS="$CPPFLAGS -I$prefix/include" + CXXFLAGS="$CXXFLAGS -I$prefix/include" +fi +]) + +dnl Check for basic stuff +dnl The following was stolen from mesa.. +dnl A few convenience macros for Mesa, mostly to keep all the platform +dnl specifics out of configure.ac. + +dnl AC_DETECT_PIC_FLAGS() +dnl +dnl Find out whether to build PIC code using the option --enable-pic and +dnl the configure enable_static/enable_shared settings. If PIC is needed, +dnl figure out the necessary flags for the platform and compiler. +dnl +dnl The platform checks have been shamelessly taken from libtool and +dnl stripped down to just what's needed for Mesa. See _LT_COMPILER_PIC in +dnl /usr/share/aclocal/libtool.m4 or +dnl http://git.savannah.gnu.org/gitweb/?p=libtool.git;a=blob;f=libltdl/m4/libtool.m4;hb=HEAD +dnl +AC_DEFUN([AC_DETECT_PIC_FLAGS], +[AC_ARG_VAR([PIC_FLAGS], [compiler flags for PIC code]) +AC_ARG_ENABLE([pic], + [AS_HELP_STRING([--disable-pic], + [compile PIC objects @<:@default=enabled for shared builds + on supported platforms@:>@])], + [enable_pic="$enableval" + test "x$enable_pic" = x && enable_pic=auto], + [enable_pic=auto]) +dnl disable PIC by default for static builds +if test "$enable_pic" = auto && test "$enable_static" = yes; then + enable_pic=no +fi +dnl if PIC hasn't been explicitly disabled, try to figure out the flags +if test "$enable_pic" != no; then + AC_MSG_CHECKING([for $CC option to produce PIC]) + dnl allow the user's flags to override + if test "x$PIC_FLAGS" = "x"; then + dnl see if we're using GCC + if test "x$GCC" = "xyes"; then + case "$host_os" in + aix*|beos*|cygwin*|irix5*|irix6*|osf3*|osf4*|osf5*) + dnl PIC is the default for these OSes. + ;; + mingw*|os2*|pw32*) + dnl This hack is so that the source file can tell whether + dnl it is being built for inclusion in a dll (and should + dnl export symbols for example). + PIC_FLAGS="-DDLL_EXPORT" + ;; + darwin*|rhapsody*) + dnl PIC is the default on this platform + dnl Common symbols not allowed in MH_DYLIB files + PIC_FLAGS="-fno-common" + ;; + hpux*) + dnl PIC is the default for IA64 HP-UX and 64-bit HP-UX, + dnl but not for PA HP-UX. + case $host_cpu in + hppa*64*|ia64*) + ;; + *) + PIC_FLAGS="-fPIC" + ;; + esac + ;; + *) + dnl Everyone else on GCC uses -fPIC + PIC_FLAGS="-fPIC" + ;; + esac + else dnl !GCC + case "$host_os" in + hpux9*|hpux10*|hpux11*) + dnl PIC is the default for IA64 HP-UX and 64-bit HP-UX, + dnl but not for PA HP-UX. + case "$host_cpu" in + hppa*64*|ia64*) + dnl +Z the default + ;; + *) + PIC_FLAGS="+Z" + ;; + esac + ;; + linux*|k*bsd*-gnu) + case `basename "$CC"` in + icc*|ecc*|ifort*) + PIC_FLAGS="-KPIC" + ;; + pgcc*|pgf77*|pgf90*|pgf95*) + dnl Portland Group compilers (*not* the Pentium gcc + dnl compiler, which looks to be a dead project) + PIC_FLAGS="-fpic" + ;; + ccc*) + dnl All Alpha code is PIC. + ;; + xl*) + dnl IBM XL C 8.0/Fortran 10.1 on PPC + PIC_FLAGS="-qpic" + ;; + *) + case `$CC -V 2>&1 | sed 5q` in + *Sun\ C*|*Sun\ F*) + dnl Sun C 5.9 or Sun Fortran + PIC_FLAGS="-KPIC" + ;; + esac + esac + ;; + solaris*) + PIC_FLAGS="-KPIC" + ;; + sunos4*) + PIC_FLAGS="-PIC" + ;; + esac + fi + fi + AC_MSG_RESULT([$PIC_FLAGS]) +fi +AC_SUBST([PIC_FLAGS]) +])dnl PIC_FLAGS + diff --git a/m4/cpp_check_class.m4 b/m4/cpp_check_class.m4 new file mode 100644 index 0000000..fb3d299 --- /dev/null +++ b/m4/cpp_check_class.m4 @@ -0,0 +1,24 @@ +dnl $1: linker lib name +dnl $2: included file +dnl $3: tested class +dnl $4: emitted variable +AC_DEFUN([AC_CPP_CHECK_CLASS], +[AC_LANG_PUSH([C++]) + SAVED_LDFLAGS=$LDFLAGS + LDFLAGS="$LDFLAGS -l$1" + AC_MSG_CHECKING([for class $3 in $1 library]) + AC_LINK_IFELSE( + [AC_LANG_PROGRAM([#include <$2>], + [$3 *x = NULL])], + [TEST_LIBS="$TEST_LIBS -l$1"] [RESULT=1], + [RESULT=]) + if test -z $RESULT; then + AC_MSG_RESULT([not found]) + else + AC_DEFINE([$4], [1], [Defined if class $3 has been found in $1 library]) + AC_MSG_RESULT([ok]) + fi + $4=$RESULT + AC_SUBST([$4]) + LDFLAGS=$SAVED_LDFLAGS + AC_LANG_POP([C++])]) diff --git a/m4/detect_binding.m4 b/m4/detect_binding.m4 new file mode 100644 index 0000000..eb02f90 --- /dev/null +++ b/m4/detect_binding.m4 @@ -0,0 +1,186 @@ +dnl =========================================================================== +dnl Helper macro to detect an optional binding + +m4_defun([AC_OCAML_COMPARE_VERSION], + [if test -z "$2" ; then + VERSION_OK=yes + else + AS_VERSION_COMPARE([$1],[$2], + [VERSION_OK=], + [VERSION_OK=yes], + [VERSION_OK=yes]) +fi]) + +m4_defun([AC_OCAML_CHECK_DEPS], + [dnl +m4_define([deps],[m4_translit([$1],['a-z'],['A-Z'])]) +DEPS_CHECK=yes +for i in deps(); do + eval "dep_check=\$W_$i" + if test -z "${dep_check}"; then + DEPS_CHECK= + break + fi +done]) + +m4_defun([AC_MSG_RESULT_NOT], + [ifelse([$1],[],[AC_MSG_RESULT($2)],[AC_MSG_ERROR($2)])]) + +m4_defun([AC_COND_PLUGIN], + [ifelse([$1],[], +[AC_ARG_ENABLE([$2-dynamic-plugin], + AC_HELP_STRING( + [--enable-$2-dynamic-plugin], + [Compile $2 as an optional dynamic plugin.]))])]) + +AC_DEFUN([AC_CHECK_OCAML_BINDING],[dnl + +m4_define([BINDING],[m4_translit([$1],['a-z.-'],['A-Z__'])]) +m4_define([binding],[m4_translit([$1],['A-Z.-'],['a-z__'])]) + +dnl $1 = PKG_NAME +dnl $2 = PKG_VERSION +dnl $3 = PKG_DEPS +dnl $4 = PKG_MANDATORY +dnl $5 = PKG_USED (for instance sdl.mixer au lieu of sdl. Should only be used for bindings not provided by us..) +dnl $6 = DYNAMIC_PLUGIN +dnl $7 = PKG_CMA (used for duppy.syntax and flac.ogg when locally compiled..) + +if test -n "$5"; then + BINDING_PKGS="$5" +else + BINDING_PKGS="$1" +fi + +AC_ARG_WITH([binding()-dir], + AC_HELP_STRING( + [--with-binding()-dir=path], + [look for ocaml-binding() library in "path" (autodetected by default)])) + +AC_COND_PLUGIN([$6],[$1]) + +dnl Version stuff +m4_define([VERSION_CHECK],[ifelse([$2],[],[],[ >= $2])]) + +AC_MSG_CHECKING([for ocaml $1 module[]VERSION_CHECK()]) + +OCAML_CHECK="${OCAMLFIND} query $1" + +dnl This (horrible) macro does the following: +dnl Detect optional binding +dnl If builtin and provided by ocamlfind, +dnl fills liquidsoap_ocamlcflags with "-package deps" for +dnl each dependency +dnl If builtin and provided by us, fills +dnl liquidsoap_ocamlcflags with "-I /path/to/ocaml-foo/src" +dnl and liquidsoap_ocamllfflags with "foo.cmxa" +dnl If plugin and provided by ocamlfind, +dnl fills plugin_packages with "deps" +dnl If plugin and provided by us, fills +dnl plugin_ocamlcflags with "-I /path/to/ocaml-foo/src" +dnl and plugin_ocamllflags with "foo.cmxa" +dnl Ultimately, plugin_ocamlcflags and plugin_ocamllflags +dnl are added to the global $PLUGINS_DATA variable and +dnl $PLUGINS is updated with the name of this plugin. +dnl W_plugin is set to "yes" for builtin compilation +dnl and "binding" for plugin compilation. + +if test "x$enable_[]binding()_dynamic_plugin" = "xyes" ; then + BINDING()_SHARED="yes" + PLUGINS="$PLUGINS binding()" +fi + +AC_OCAML_CHECK_DEPS([$3]) +if test -z $DEPS_CHECK; then + AC_MSG_RESULT([[]binding() needs $3]) +else + if test -z "${with_[]binding()_dir}" ; then + if ! ${OCAML_CHECK} > /dev/null 2>&1 ; then + AC_MSG_RESULT_NOT([$4],[Not found.]) + else + BINDING()_version="`${OCAMLFIND} query -format "%v" $1 2>/dev/null`" + AC_OCAML_COMPARE_VERSION([${[]BINDING()_version}],[$2]) + if test -z "${VERSION_OK}"; then + AC_MSG_RESULT_NOT([$4],[requires version >= $2 found ${[]BINDING()_version}.]) + else + if test -z "${[]BINDING()_SHARED}"; then + BINDING()_PACKAGES="`${OCAMLFIND} query -separator " " -format "-package %p" $BINDING_PKGS 2>/dev/null`" + liquidsoap_ocamlcflags="${liquidsoap_ocamlcflags} ${[]BINDING()_PACKAGES}" + W_[]BINDING()=yes + else + []binding()_packages="`${OCAMLFIND} query -r -separator " " -format "%p" $BINDING_PKGS 2>/dev/null`" + W_[]BINDING()=[]binding() + fi + LIBS_VERSIONS="${LIBS_VERSIONS} $1=$[]BINDING()_version" + AC_MSG_RESULT(ok) + fi + fi + else + BINDING()_STOP_CHECK= + BINDING()_version=changequote({,})"[unknown version]"changequote([,]) + BINDING()_requires= + if test -r ${with_[]binding()_dir}/META >/dev/null 2>&1; then + # Grab version + BINDING()_version=`cat "${with_[]binding()_dir}/META" | grep version | cut -d'=' -f 2 | tr -d ' ' | tr -d '"' | head -n 1` + AC_OCAML_COMPARE_VERSION([${[]BINDING()_version}],[$2]) + if test -z "${VERSION_OK}"; then + AC_MSG_RESULT_NOT([$4],[requires version >= $2 found ${[]BINDING()_version}.]) + BINDING()_STOP_CHECK=yes + fi + BINDING()_requires=`cat "${with_[]binding()_dir}/META" | grep 'requires' | cut -d '=' -f 2 | tr -d '"'` + BINDING()_path="${with_[]binding()_dir}" + else + BINDING()_path=`${OCAMLFIND} -query $1 2>/dev/null` + if ! test -z "$2"; then + AC_MSG_RESULT_NOT([$4],[cannot find version from META file.]) + BINDING()_STOP_CHECK=yes + fi + fi + if test -z "${BINDING()_STOP_CHECK}"; then + BINDING()_PACKAGES="`${OCAMLFIND} query -separator " " -format "-package %p" $BINGING_PKGS 2>/dev/null`" + echo ${with_[]binding()_dir} | grep ^/ > /dev/null 2>&1 \ + || with_[]binding()_dir=${PWD}/${with_[]binding()_dir} + if test -z "${[]BINDING()_SHARED}"; then + liquidsoap_ocamlcflags="${liquidsoap_ocamlcflags} -I ${with_[]binding()_dir} ${[]BINDING()_PACKAGES}" + else + []binding()_ocamlcflags="-I ${with_[]binding()_dir} ${[]BINDING()_PACKAGES}" + fi + # We need to recurse here because + # some package may not be registered using ocamlfind + if test -n "$7"; then + BINDING()_CMA=$7.${cma} + else + BINDING()_CMA=$1.${cma} + fi + for i in ${[]BINDING()_requires}; do + BINDING()_PACKAGES="${[]BINDING()_PACKAGES} `${OCAMLFIND} query -separator " " -format "-package %p" $i 2>/dev/null`" + done + if test -z "${[]BINDING()_SHARED}"; then + liquidsoap_ocamllflags="${liquidsoap_ocamllflags} ${[]BINDING()_PACKAGES} ${[]BINDING()_CMA}" + W_[]BINDING()=yes + else + []binding()_ocamllflags="${[]BINDING()_PACKAGES} ${[]BINDING()_CMA}" + W_[]BINDING()=[]binding() + fi + LIBS_VERSIONS="${LIBS_VERSIONS} $1=$[]BINDING()_version" + AC_MSG_RESULT(ok) + fi + fi +fi + +AC_SUBST(W_[]BINDING()) +if test -z "${W_[]BINDING()}" ; then + w_[]BINDING()="no (requires $1)" +else + if test -z "${[]BINDING()_SHARED}"; then + w_[]BINDING()=yes + else + PLUGINS_DATA="$PLUGINS_DATA +[]binding()_ocamlcflags=${[]binding()_ocamlcflags} +[]binding()_ocamllflags=${[]binding()_ocamllflags} +[]binding()_packages=${[]binding()_packages}" + w_[]BINDING()=plugin + fi +fi]) + + diff --git a/m4/ocaml.m4 b/m4/ocaml.m4 new file mode 100644 index 0000000..28d1350 --- /dev/null +++ b/m4/ocaml.m4 @@ -0,0 +1,329 @@ +dnl autoconf macros for OCaml +dnl +dnl Copyright © 2009 Richard W.M. Jones +dnl Copyright © 2009 Stefano Zacchiroli +dnl Copyright © 2000-2005 Olivier Andrieu +dnl Copyright © 2000-2005 Jean-Christophe Filliâtre +dnl Copyright © 2000-2005 Georges Mariano +dnl +dnl For documentation, please read the ocaml.m4 man page. + +AC_DEFUN([AC_PROG_OCAML], +[dnl + # checking for ocamlc + AC_CHECK_TOOL([OCAMLC],[ocamlc],[no]) + + if test "$OCAMLC" = "no"; then + AC_MSG_ERROR(Cannot find ocamlc.) + fi + + AC_SUBST([OCAMLC]) + + OCAMLVERSION=`$OCAMLC -v | sed -n -e 's|.*version* *\(.*\)$|\1|p'` + AC_MSG_RESULT([OCaml version is $OCAMLVERSION]) + # Check if version is >= 3.12.0 + AC_MSG_CHECKING([if ocaml compiler supports first-class modules]) + AS_VERSION_COMPARE([$OCAMLVERSION],[3.12.0],[],[OCAML_HAS_FIRST_CLASS_MODULES="yes"],[OCAML_HAS_FIRST_CLASS_MODULES="yes"]) + if test -n "${OCAML_HAS_FIRST_CLASS_MODULES}"; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + fi + AC_SUBST(OCAML_HAS_FIRST_CLASS_MODULES) + + # If OCAMLLIB is set, use it + if test "$OCAMLLIB" = ""; then + OCAMLLIB=`$OCAMLC -where 2>/dev/null || $OCAMLC -v|tail -1|cut -d ' ' -f 4` + else + AC_MSG_RESULT([OCAMLLIB previously set; preserving it.]) + fi + AC_MSG_RESULT([OCaml library path is $OCAMLLIB]) + + AC_SUBST([OCAMLVERSION]) + AC_SUBST([OCAMLLIB]) + + # checking for ocamlopt + AC_CHECK_TOOL_STRICT([OCAMLOPT],[ocamlopt],[no]) + OCAMLBEST=byte + OCAML_DYNLINK=byte-dyn + if test "$OCAMLOPT" = "no"; then + AC_MSG_WARN([Cannot find ocamlopt; bytecode compilation only.]) + else + TMPVERSION=`$OCAMLOPT -v | sed -n -e 's|.*version* *\(.*\)$|\1|p' ` + if test "$TMPVERSION" != "$OCAMLVERSION" ; then + AC_MSG_RESULT([versions differs from ocamlc; ocamlopt discarded.]) + OCAMLOPT=no + else + OCAMLBEST="byte opt" + OCAML_DYNLINK="byte-dyn opt-dyn" + fi + fi + + AC_SUBST([OCAMLBEST]) + AC_SUBST([OCAML_DYNLINK]) + + # checking for ocamlc.opt + AC_CHECK_TOOL_STRICT([OCAMLCDOTOPT],[ocamlc.opt],[no]) + if test "$OCAMLCDOTOPT" != "no"; then + TMPVERSION=`$OCAMLCDOTOPT -v | sed -n -e 's|.*version* *\(.*\)$|\1|p' ` + if test "$TMPVERSION" != "$OCAMLVERSION" ; then + AC_MSG_RESULT([versions differs from ocamlc; ocamlc.opt discarded.]) + else + OCAMLC=$OCAMLCDOTOPT + fi + fi + + # checking for ocamlopt.opt + if test "$OCAMLOPT" != "no" ; then + AC_CHECK_TOOL_STRICT([OCAMLOPTDOTOPT],[ocamlopt.opt],[no]) + if test "$OCAMLOPTDOTOPT" != "no"; then + TMPVERSION=`$OCAMLOPTDOTOPT -v | sed -n -e 's|.*version* *\(.*\)$|\1|p' ` + if test "$TMPVERSION" != "$OCAMLVERSION" ; then + AC_MSG_RESULT([version differs from ocamlc; ocamlopt.opt discarded.]) + else + OCAMLOPT=$OCAMLOPTDOTOPT + fi + fi + fi + + AC_SUBST([OCAMLOPT]) + + # checking for ocaml toplevel + AC_CHECK_TOOL_STRICT([OCAML],[ocaml],[no]) + + AC_SUBST([OCAML]) + + # checking for ocamldep + AC_CHECK_TOOL_STRICT([OCAMLDEP],[ocamldep],[no]) + if test "$OCAMLDEP" = "no"; then + AC_MSG_ERROR(Cannot find ocamlmklib.) + else + AC_CHECK_TOOL_STRICT([OCAMLDEPOPT],[ocamldep.opt],[no]) + if test "$OCAMLDEPOPT" != "no"; then + OCAMLDEP=$OCAMLDEPOPT + fi + fi + + AC_SUBST([OCAMLDEP]) + + # checking for ocamlmktop + AC_CHECK_TOOL_STRICT([OCAMLMKTOP],[ocamlmktop],[no]) + + AC_SUBST([OCAMLMKTOP]) + + # checking for ocamlmklib + AC_CHECK_TOOL_STRICT([OCAMLMKLIB],[ocamlmklib],[no]) + if test "$OCAMLMKLIB" = "no"; then + AC_MSG_ERROR(Cannot find ocamlmklib.) + fi + + AC_SUBST([OCAMLMKLIB]) + + # checking for ocamldoc + AC_CHECK_TOOL([OCAMLDOC],[ocamldoc],[no]) + if test "$OCAMLDOC" != "no"; then + AC_CHECK_TOOL([OCAMLDOCOPT],[ocamldoc.opt],[no]) + if test "$OCAMLDOCOPT" != "no"; then + OCAMLDOC=$OCAMLDOCOPT + fi + fi + + AC_SUBST([OCAMLDOC]) + + # checking for ocamlbuild + AC_CHECK_TOOL([OCAMLBUILD],[ocamlbuild],[no]) + + AC_SUBST([OCAMLBUILD]) +]) + + +AC_DEFUN([AC_PROG_OCAMLLEX], +[dnl + # checking for ocamllex + AC_CHECK_TOOL([OCAMLLEX],[ocamllex],[no]) + if test "$OCAMLLEX" != "no"; then + AC_CHECK_TOOL([OCAMLLEXDOTOPT],[ocamllex.opt],[no]) + if test "$OCAMLLEXDOTOPT" != "no"; then + OCAMLLEX=$OCAMLLEXDOTOPT + fi + fi + AC_SUBST([OCAMLLEX]) +]) + +AC_DEFUN([AC_PROG_OCAMLYACC], +[dnl + AC_CHECK_TOOL([OCAMLYACC],[ocamlyacc],[no]) + AC_SUBST([OCAMLYACC]) +]) + + +AC_DEFUN([AC_PROG_CAMLP4], +[dnl + AC_REQUIRE([AC_PROG_OCAML])dnl + + + AC_ARG_ENABLE([camlp4], + AC_HELP_STRING([--disable-camlp4], + [disable camlp4 auto-detection.])) + + # checking for camlp4 + if test "x$enable_camlp4" != "xno"; then + AC_CHECK_TOOL_STRICT([CAMLP4],[camlp4],[no]) + if test "$CAMLP4" != "no"; then + TMPVERSION=`$CAMLP4 -v 2>&1| sed -n -e 's|.*version *\(.*\)$|\1|p' | tr -d '\r'` + if test "$TMPVERSION" != "$OCAMLVERSION" ; then + AC_MSG_RESULT([versions differs from ocamlc]) + CAMLP4=no + fi + fi + AC_SUBST([CAMLP4]) + + # checking for companion tools + AC_CHECK_TOOL_STRICT([CAMLP4BOOT],[camlp4boot],[no]) + AC_CHECK_TOOL_STRICT([CAMLP4O],[camlp4o],[no]) + AC_CHECK_TOOL_STRICT([CAMLP4OF],[camlp4of],[no]) + AC_CHECK_TOOL_STRICT([CAMLP4OOF],[camlp4oof],[no]) + AC_CHECK_TOOL_STRICT([CAMLP4ORF],[camlp4orf],[no]) + AC_CHECK_TOOL_STRICT([CAMLP4PROF],[camlp4prof],[no]) + AC_CHECK_TOOL_STRICT([CAMLP4R],[camlp4r],[no]) + AC_CHECK_TOOL_STRICT([CAMLP4RF],[camlp4rf],[no]) + else + CAMLP4=no + CAMLP4BOOT=no + CAMLP4O=no + CAMLP4OF=no + CAMLP4OOF=no + CAMLP4ORF=no + CAMLP4PROF=no + CAMLP4R=no + CAMLP4RF=no + fi + + AC_SUBST([CAMLP4BOOT]) + AC_SUBST([CAMLP4O]) + AC_SUBST([CAMLP4OF]) + AC_SUBST([CAMLP4OOF]) + AC_SUBST([CAMLP4ORF]) + AC_SUBST([CAMLP4PROF]) + AC_SUBST([CAMLP4R]) + AC_SUBST([CAMLP4RF]) +]) + +AC_DEFUN([AC_PROG_CAMLIDL], +[dnl + AC_CHECK_TOOL(CAMLIDL,camlidl,no) + AC_SUBST(CAMLIDL) +]) + +AC_DEFUN([AC_PROG_FINDLIB], +[dnl + AC_REQUIRE([AC_PROG_OCAML])dnl + + # checking for ocamlfind + AC_CHECK_TOOL([OCAMLFIND],[ocamlfind],[no]) + AC_SUBST([OCAMLFIND]) +]) + +AC_DEFUN([AC_CHECK_OCAML_STDLIB], +[dnl + AC_REQUIRE([AC_PROG_FINDLIB])dnl + + AC_MSG_CHECKING([for ocaml standard library path]) + OCAML_STDLIB=`$OCAMLFIND printconf stdlib` + AC_SUBST(OCAML_STDLIB) + AC_MSG_RESULT([$OCAML_STDLIB]) +]) + +dnl Thanks to Jim Meyering for working this next bit out for us. +dnl XXX We should define AS_TR_SH if it's not defined already +dnl (eg. for old autoconf). +AC_DEFUN([AC_CHECK_OCAML_PKG], +[dnl + AC_REQUIRE([AC_PROG_FINDLIB])dnl + + AC_ARG_WITH([$1-dir],AC_HELP_STRING([--with-$1-dir=path], + [use "path" as the location of ocaml-$1 (autodetected by default)])) + AC_MSG_CHECKING([for OCaml library $1]) + + unset found + unset pkg + found=no + if test -z "$with_$1_dir"; then + for pkg in $1 $2 ; do + if $OCAMLFIND query $pkg >/dev/null 2>/dev/null; then + AC_MSG_RESULT([found]) + AS_TR_SH([OCAML_PKG_$1])=$pkg + AS_TR_SH([OCAML_DIR_$1])=`$OCAMLFIND query $1` + found=yes + break + fi + done + else + echo $with_$1_dir | grep ^/ > /dev/null 2>&1 || with_$1_dir=$PWD/$with_$1_dir + AS_TR_SH([OCAML_PKG_$1])=no + OCAML_DIR_$1="$with_$1_dir" + found=yes + fi + if test "$found" = "no" ; then + AC_MSG_RESULT([not found]) + AS_TR_SH([OCAML_HAS_$1])=no + AS_TR_SH([OCAML_PKG_$1])=no + else + AS_TR_SH([OCAML_HAS_$1])=yes + fi + + AC_SUBST(AS_TR_SH([OCAML_PKG_$1])) +]) + + +AC_DEFUN([AC_CHECK_OCAML_MODULE], +[dnl + AC_MSG_CHECKING([for OCaml module $2]) + + cat > conftest.ml <&5 2>&5 ; then + found=yes + break + fi + done + + if test "$found" ; then + AC_MSG_RESULT([$$1]) + else + AC_MSG_RESULT([not found]) + $1=no + fi + AC_SUBST([$1]) +]) + + +dnl XXX Cross-compiling +AC_DEFUN([AC_CHECK_OCAML_WORD_SIZE], +[dnl + AC_REQUIRE([AC_PROG_OCAML])dnl + AC_MSG_CHECKING([for OCaml compiler word size]) + cat > conftest.ml < conftest.ml <]) +CFLAGS=${old_CFLAGS} + +AC_ARG_ENABLE([debugging], + AC_HELP_STRING( + [--disable-debugging], + [disable debugging information (backtrace printing in particular)])) + +if test "$enable_debugging" \!= "no" ; then + OCAMLFLAGS="$OCAMLFLAGS -g" +fi + +AC_ARG_WITH([ocaml-warnings], + AC_HELP_STRING( + [--with-ocaml-warnings=WARNINGS], + [Enable specific list of ocaml compiler warnings.])) + +if test -n "${with_ocaml_warnings}" ; then + OCAMLFLAGS="$OCAMLFLAGS -w +${with_ocaml_warnings}" +else + OCAMLFLAGS="$OCAMLFLAGS -w +A-4@5-7@8-9@11@12@20-35-44-45-50" +fi + +AC_ARG_ENABLE([profiling], + AC_HELP_STRING( + [--enable-profiling], + [compile to generate profiling infomation])) +if test "x$enable_profiling" = "xyes" ; then + OCAMLNCFLAGS="$OCAMLNCFLAGS -p" +fi +AC_SUBST(OCAMLNCFLAGS) + +AC_ARG_ENABLE([nativecode], + AC_HELP_STRING( + [--disable-nativecode], + [compile in bytecode])) + +AC_ARG_ENABLE([custom], + AC_HELP_STRING( + [--disable-custom], + [disable custom mode for bytecode compilation (use if you know what you are doing)])) + +CAMLLIBPATH=$OCAMLLIB +AC_SUBST(CAMLLIBPATH) + +AC_SUBST(CAMLIDL) +AC_SUBST(OCAMLFLAGS) +]) diff --git a/m4/pkg_config.m4 b/m4/pkg_config.m4 new file mode 100644 index 0000000..f940dff --- /dev/null +++ b/m4/pkg_config.m4 @@ -0,0 +1,76 @@ +dnl Taken an modified from: +dnl pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +dnl +dnl Copyright © 2004 Scott James Remnant . +dnl +dnl This program 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 2 of the License, or +dnl (at your option) any later version. +dnl +dnl This program is distributed in the hope that it will be useful, but +dnl WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +dnl General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with this program; if not, write to the Free Software +dnl Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +dnl +dnl As a special exception to the GNU General Public License, if you +dnl distribute this file as part of a program that contains a +dnl configuration script generated by Autoconf, you may include it under +dnl the same distribution terms that you use for the rest of that program. + +dnl PKG_PROG_PKG_CONFIG([MIN-VERSION]) +dnl ---------------------------------- +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_PATH)?$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])dnl +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_default([$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_ERROR([no]) + PKG_CONFIG="" + fi + +fi[]dnl +])dnl PKG_PROG_PKG_CONFIG + +AC_ARG_VAR([PKG_CONFIG_OPTIONS], [Additional options passed when invoking pkg-config]) + +dnl PKG_CONFIG_CHECK_MODULE([name],[min-version]) +dnl min-version is optional +AC_DEFUN([PKG_CONFIG_CHECK_MODULE], +[if test -n "$2"; then + PKGCONFIG_CHECK_VERSION=" >= $2" +else + PKGCONFIG_CHECK_VERSION="" +fi +AC_MSG_CHECKING([whether pkg-config knows about $1${PKGCONFIG_CHECK_VERSION}]) +if ! $PKG_CONFIG $PKG_CONFIG_OPTIONS --exists $1; then + AC_MSG_ERROR([$1.pc not found.. Do you need to set PKG_CONFIG_PATH?]) +else + if test -n "$2"; then + if ! $PKG_CONFIG $PKG_CONFIG_OPTIONS --atleast-version=$2 $1; then + $1_VERSION="`$PKG_CONFIG $PKG_CONFIG_OPTIONS --modversion $1`" + AC_MSG_ERROR([requires version >= $2, found ${$1_VERSION}]) + else + AC_MSG_RESULT([ok]) + fi + else + AC_MSG_RESULT([ok]) + fi +fi +CFLAGS="$CFLAGS `$PKG_CONFIG $PKG_CONFIG_OPTIONS --cflags $1`" +CPPFLAGS="$CPPFLAGS `$PKG_CONFIG $PKG_CONFIG_OPTIONS --cflags $1`" +LIBS="$LIBS `$PKG_CONFIG $PKG_CONFIG_OPTIONS --libs-only-l $1`" +LDFLAGS="$LDFLAGS `$PKG_CONFIG $PKG_CONFIG_OPTIONS --libs-only-L $1`" +]) diff --git a/m4/strict_check_tool.m4 b/m4/strict_check_tool.m4 new file mode 100644 index 0000000..6a52090 --- /dev/null +++ b/m4/strict_check_tool.m4 @@ -0,0 +1,7 @@ +AC_DEFUN([AC_CHECK_TOOL_STRICT], +[AC_CHECK_PROG([$1], [${ac_tool_prefix}$2], [${ac_tool_prefix}$2], [$3], [$4])]) + +AC_DEFUN([AC_PATH_TOOL_STRICT], +[AC_PATH_PROG([$1], [${ac_tool_prefix}$2], [$3])]) + + diff --git a/src/META.in b/src/META.in new file mode 100644 index 0000000..9480812 --- /dev/null +++ b/src/META.in @@ -0,0 +1,10 @@ +name="duppy" +version="@VERSION@" +description="OCaml advanced scheduler" +requires="@requires@" +archive(byte)="duppy.cma" +archive(native)="duppy.cmxa" + +@DUPPY_SSL_META@ + +@DUPPY_SECURE_TRANSPORT_META@ diff --git a/src/Makefile.in b/src/Makefile.in new file mode 100644 index 0000000..2fb5511 --- /dev/null +++ b/src/Makefile.in @@ -0,0 +1,68 @@ +# Copyright (C) 2005-2006 Savonet team +# lastfm bindings for OCaml. +# +# by Samuel Mimram and Romain Beauxis + +# $Id: Makefile.in 2383 2006-04-09 16:21:04Z smimram $ + +OCAMLMAKEFILE = OCamlMakefile + +OCAMLFIND = @OCAMLFIND@ +OCAMLFIND_LDCONF = @OCAMLFIND_LDCONF@ +OCAMLC = @OCAMLC@ -thread +OCAMLOPT = @OCAMLOPT@ -thread +OCAMLBEST = @OCAMLBEST@ +OCAMLMKTOP = @OCAMLMKTOP@ +OCAMLMKLIB = @OCAMLMKLIB@ +OCAMLCP = @OCAMLCP@ +OCAMLDEP = @OCAMLDEP@ +OCAMLLEX = @OCAMLLEX@ +OCAMLYACC = @OCAMLYACC@ +OCAMLDOC = @OCAMLDOC@ +LATEX = @LATEX@ +DVIPS = @DVIPS@ +PS2PDF = @PS2PDF@ +OCAMLLIBPATH = @CAMLLIBPATH@ + +SOURCES = duppy_stubs.c duppy.ml duppy.mli +RESULT = duppy +OCAMLDOCFLAGS = -stars +DOC_FILES = $(filter %.mli, $(SOURCES)) +LIBINSTALL_FILES = $(DOC_FILES) $(wildcard *.cmi *.cma *.cmxa *.cmx *.a *.so) +ACLIBS = @LIBS@ +LDFLAGS = @LDFLAGS@ +CLIBS = $(ACLIBS:-l%=%) +CC = @CC@ +AR = @AR@ +CFLAGS = @CFLAGS@ -Wall -DCAML_NAME_SPACE +CPPFLAGS = @CPPFLAGS@ +INCDIRS = @INC@ +NO_CUSTOM = yes +OCAMLFLAGS = @OCAMLFLAGS@ +ANNOTATE = true + +all: $(OCAMLBEST) @DUPPY_SSL@ @DUPPY_SECURE_TRANSPORT@ + +duppy_ssl: + $(MAKE) SOURCES="duppy_ssl.mli duppy_ssl.ml" RESULT="duppy_ssl" $(OCAMLBEST) + +duppy_secure_transport: + $(MAKE) SOURCES="duppy_secure_transport.mli duppy_secure_transport.ml" RESULT="duppy_secure_transport" $(OCAMLBEST) + +byte: byte-code-library + +opt: native-code-library + +native-code-library: byte-code-library + +htdoc: + mkdir -p doc/html + ocamldoc -html -d doc/html + +install: libinstall + +uninstall: libuninstall + +update: uninstall install + +-include $(OCAMLMAKEFILE) diff --git a/src/OCamlMakefile b/src/OCamlMakefile new file mode 100644 index 0000000..18fcc34 --- /dev/null +++ b/src/OCamlMakefile @@ -0,0 +1,1138 @@ +########################################################################### +# OCamlMakefile +# Copyright (C) 1999-2004 Markus Mottl +# +# For updates see: +# http://www.oefai.at/~markus/ocaml_sources +# +# $Id: OCamlMakefile 4512 2007-09-05 14:17:36Z sgimenez $ +# +########################################################################### + +# Modified by damien for .glade.ml compilation + +# Set these variables to the names of the sources to be processed and +# the result variable. Order matters during linkage! + +ifndef SOURCES + SOURCES := foo.ml +endif +export SOURCES + +ifndef RES_CLIB_SUF + RES_CLIB_SUF := _stubs +endif +export RES_CLIB_SUF + +ifndef RESULT + RESULT := foo +endif +export RESULT + +export LIB_PACK_NAME + +ifndef DOC_FILES + DOC_FILES := $(filter %.mli, $(SOURCES)) +endif +export DOC_FILES + +export BCSUFFIX +export NCSUFFIX + +ifndef TOPSUFFIX + TOPSUFFIX := .top +endif +export TOPSUFFIX + +# Eventually set include- and library-paths, libraries to link, +# additional compilation-, link- and ocamlyacc-flags +# Path- and library information needs not be written with "-I" and such... +# Define THREADS if you need it, otherwise leave it unset (same for +# USE_CAMLP4)! + +export THREADS +export VMTHREADS +export ANNOTATE +export USE_CAMLP4 + +export INCDIRS +export LIBDIRS +export EXTLIBDIRS +export RESULTDEPS +export OCAML_DEFAULT_DIRS + +export LIBS +export CLIBS + +export OCAMLFLAGS +export OCAMLNCFLAGS +export OCAMLBCFLAGS + +export OCAMLLDFLAGS +export OCAMLNLDFLAGS +export OCAMLBLDFLAGS + +ifndef OCAMLCPFLAGS + OCAMLCPFLAGS := a +endif + +export OCAMLCPFLAGS + +export PPFLAGS + +export YFLAGS +export IDLFLAGS + +export OCAMLDOCFLAGS + +export OCAMLFIND_INSTFLAGS + +export DVIPSFLAGS + +export STATIC + +# Add a list of optional trash files that should be deleted by "make clean" +export TRASH + +#################### variables depending on your OCaml-installation + +ifdef MINGW + export MINGW + WIN32 := 1 + CFLAGS_WIN32 := -mno-cygwin +endif +ifdef MSVC + export MSVC + WIN32 := 1 + ifndef STATIC + CPPFLAGS_WIN32 := -DCAML_DLL + endif + CFLAGS_WIN32 += -nologo + EXT_OBJ := obj + EXT_LIB := lib + ifeq ($(CC),gcc) + # work around GNU Make default value + ifdef THREADS + CC := cl -MT + else + CC := cl + endif + endif + ifeq ($(CXX),g++) + # work around GNU Make default value + CXX := $(CC) + endif + CFLAG_O := -Fo +endif +ifdef WIN32 + EXT_CXX := cpp + EXE := .exe +endif + +ifndef EXT_OBJ + EXT_OBJ := o +endif +ifndef EXT_LIB + EXT_LIB := a +endif +ifndef EXT_CXX + EXT_CXX := cc +endif +ifndef EXE + EXE := # empty +endif +ifndef CFLAG_O + CFLAG_O := -o # do not delete this comment (preserves trailing whitespace)! +endif + +export CC +export CXX +export CFLAGS +export CXXFLAGS +export LDFLAGS +export CPPFLAGS +export AR + +ifndef RPATH_FLAG + RPATH_FLAG := -R +endif +export RPATH_FLAG + +ifndef MSVC +ifndef PIC_CFLAGS + PIC_CFLAGS := -fPIC +endif +ifndef PIC_CPPFLAGS + PIC_CPPFLAGS := -DPIC +endif +endif + +export PIC_CFLAGS +export PIC_CPPFLAGS + +BCRESULT := $(addsuffix $(BCSUFFIX), $(RESULT)) +NCRESULT := $(addsuffix $(NCSUFFIX), $(RESULT)) +TOPRESULT := $(addsuffix $(TOPSUFFIX), $(RESULT)) + +ifndef OCAMLFIND + OCAMLFIND := ocamlfind +endif +export OCAMLFIND + +ifndef OCAMLC + OCAMLC := ocamlc +endif +export OCAMLC + +ifndef OCAMLOPT + OCAMLOPT := ocamlopt +endif +export OCAMLOPT + +ifndef OCAMLMKTOP + OCAMLMKTOP := ocamlmktop +endif +export OCAMLMKTOP + +ifndef OCAMLCP + OCAMLCP := ocamlcp +endif +export OCAMLCP + +ifndef OCAMLDEP + OCAMLDEP := ocamldep +endif +export OCAMLDEP + +ifndef OCAMLLEX + OCAMLLEX := ocamllex +endif +export OCAMLLEX + +ifndef OCAMLYACC + OCAMLYACC := ocamlyacc +endif +export OCAMLYACC + +ifndef OCAMLMKLIB + OCAMLMKLIB := ocamlmklib +endif +export OCAMLMKLIB + +ifndef OCAML_GLADECC + OCAML_GLADECC := lablgladecc2 +endif +export OCAML_GLADECC + +ifndef OCAML_GLADECC_FLAGS + OCAML_GLADECC_FLAGS := +endif +export OCAML_GLADECC_FLAGS + +ifndef CAMELEON_REPORT + CAMELEON_REPORT := report +endif +export CAMELEON_REPORT + +ifndef CAMELEON_REPORT_FLAGS + CAMELEON_REPORT_FLAGS := +endif +export CAMELEON_REPORT_FLAGS + +ifndef CAMELEON_ZOGGY + CAMELEON_ZOGGY := camlp4o pa_zog.cma pr_o.cmo +endif +export CAMELEON_ZOGGY + +ifndef CAMELEON_ZOGGY_FLAGS + CAMELEON_ZOGGY_FLAGS := +endif +export CAMELEON_ZOGGY_FLAGS + +ifndef OXRIDL + OXRIDL := oxridl +endif +export OXRIDL + +ifndef CAMLIDL + CAMLIDL := camlidl +endif +export CAMLIDL + +ifndef CAMLIDLDLL + CAMLIDLDLL := camlidldll +endif +export CAMLIDLDLL + +ifndef NOIDLHEADER + MAYBE_IDL_HEADER := -header +endif +export NOIDLHEADER + +export NO_CUSTOM + +ifndef CAMLP4 + CAMLP4 := camlp4 +endif +export CAMLP4 + +ifndef REAL_OCAMLFIND + ifdef PACKS + ifndef CREATE_LIB + ifdef THREADS + PACKS += threads + endif + endif + empty := + space := $(empty) $(empty) + comma := , + ifdef PREDS + PRE_OCAML_FIND_PREDICATES := $(subst $(space),$(comma),$(PREDS)) + PRE_OCAML_FIND_PACKAGES := $(subst $(space),$(comma),$(PACKS)) + OCAML_FIND_PREDICATES := -predicates $(PRE_OCAML_FIND_PREDICATES) + # OCAML_DEP_PREDICATES := -syntax $(PRE_OCAML_FIND_PREDICATES) + OCAML_FIND_PACKAGES := $(OCAML_FIND_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES) + OCAML_DEP_PACKAGES := $(OCAML_DEP_PREDICATES) -package $(PRE_OCAML_FIND_PACKAGES) + else + OCAML_FIND_PACKAGES := -package $(subst $(space),$(comma),$(PACKS)) + OCAML_DEP_PACKAGES := + endif + OCAML_FIND_LINKPKG := -linkpkg + REAL_OCAMLFIND := $(OCAMLFIND) + endif +endif + +export OCAML_FIND_PACKAGES +export OCAML_DEP_PACKAGES +export OCAML_FIND_LINKPKG +export REAL_OCAMLFIND + +ifndef OCAMLDOC + OCAMLDOC := ocamldoc +endif +export OCAMLDOC + +ifndef LATEX + LATEX := latex +endif +export LATEX + +ifndef DVIPS + DVIPS := dvips +endif +export DVIPS + +ifndef PS2PDF + PS2PDF := ps2pdf +endif +export PS2PDF + +ifndef OCAMLMAKEFILE + OCAMLMAKEFILE := OCamlMakefile +endif +export OCAMLMAKEFILE + +ifndef OCAMLLIBPATH + OCAMLLIBPATH := \ + $(shell $(OCAMLC) 2>/dev/null -where || echo /usr/lib/ocaml) +endif +export OCAMLLIBPATH + +ifndef OCAML_LIB_INSTALL + OCAML_LIB_INSTALL := $(OCAMLLIBPATH)/contrib +endif +export OCAML_LIB_INSTALL + +########################################################################### + +#################### change following sections only if +#################### you know what you are doing! + +# delete target files when a build command fails +.PHONY: .DELETE_ON_ERROR +.DELETE_ON_ERROR: + +# for pedants using "--warn-undefined-variables" +export MAYBE_IDL +export REAL_RESULT +export CAMLIDLFLAGS +export THREAD_FLAG +export RES_CLIB +export MAKEDLL +export ANNOT_FLAG +export C_OXRIDL +export SUBPROJS +export CFLAGS_WIN32 +export CPPFLAGS_WIN32 + +INCFLAGS := + +SHELL := /bin/sh + +MLDEPDIR := ._d +BCDIDIR := ._bcdi +NCDIDIR := ._ncdi + +FILTER_EXTNS := %.mli %.ml %.mll %.mly %.idl %.oxridl %.c %.$(EXT_CXX) %.rep %.zog %.glade + +FILTERED := $(filter $(FILTER_EXTNS), $(SOURCES)) +SOURCE_DIRS := $(filter-out ./, $(sort $(dir $(FILTERED)))) + +FILTERED_REP := $(filter %.rep, $(FILTERED)) +DEP_REP := $(FILTERED_REP:%.rep=$(MLDEPDIR)/%.d) +AUTO_REP := $(FILTERED_REP:.rep=.ml) + +FILTERED_ZOG := $(filter %.zog, $(FILTERED)) +DEP_ZOG := $(FILTERED_ZOG:%.zog=$(MLDEPDIR)/%.d) +AUTO_ZOG := $(FILTERED_ZOG:.zog=.ml) + +FILTERED_GLADE := $(filter %.glade, $(FILTERED)) +DEP_GLADE := $(FILTERED_GLADE:%.glade=$(MLDEPDIR)/%.d) +AUTO_GLADE := $(FILTERED_GLADE:.glade=.ml) + +FILTERED_ML := $(filter %.ml, $(FILTERED)) +DEP_ML := $(FILTERED_ML:%.ml=$(MLDEPDIR)/%.d) + +FILTERED_MLI := $(filter %.mli, $(FILTERED)) +DEP_MLI := $(FILTERED_MLI:.mli=.di) + +FILTERED_MLL := $(filter %.mll, $(FILTERED)) +DEP_MLL := $(FILTERED_MLL:%.mll=$(MLDEPDIR)/%.d) +AUTO_MLL := $(FILTERED_MLL:.mll=.ml) + +FILTERED_MLY := $(filter %.mly, $(FILTERED)) +DEP_MLY := $(FILTERED_MLY:%.mly=$(MLDEPDIR)/%.d) $(FILTERED_MLY:.mly=.di) +AUTO_MLY := $(FILTERED_MLY:.mly=.mli) $(FILTERED_MLY:.mly=.ml) + +FILTERED_IDL := $(filter %.idl, $(FILTERED)) +DEP_IDL := $(FILTERED_IDL:%.idl=$(MLDEPDIR)/%.d) $(FILTERED_IDL:.idl=.di) +C_IDL := $(FILTERED_IDL:%.idl=%_stubs.c) +ifndef NOIDLHEADER + C_IDL += $(FILTERED_IDL:.idl=.h) +endif +OBJ_C_IDL := $(FILTERED_IDL:%.idl=%_stubs.$(EXT_OBJ)) +AUTO_IDL := $(FILTERED_IDL:.idl=.mli) $(FILTERED_IDL:.idl=.ml) $(C_IDL) + +FILTERED_OXRIDL := $(filter %.oxridl, $(FILTERED)) +DEP_OXRIDL := $(FILTERED_OXRIDL:%.oxridl=$(MLDEPDIR)/%.d) $(FILTERED_OXRIDL:.oxridl=.di) +AUTO_OXRIDL := $(FILTERED_OXRIDL:.oxridl=.mli) $(FILTERED_OXRIDL:.oxridl=.ml) $(C_OXRIDL) + +FILTERED_C_CXX := $(filter %.c %.$(EXT_CXX), $(FILTERED)) +OBJ_C_CXX := $(FILTERED_C_CXX:.c=.$(EXT_OBJ)) +OBJ_C_CXX := $(OBJ_C_CXX:.$(EXT_CXX)=.$(EXT_OBJ)) + +PRE_TARGETS += $(AUTO_MLL) $(AUTO_MLY) $(AUTO_IDL) $(AUTO_OXRIDL) $(AUTO_ZOG) $(AUTO_REP) $(AUTO_GLADE) + +ALL_DEPS := $(DEP_ML) $(DEP_MLI) $(DEP_MLL) $(DEP_MLY) $(DEP_IDL) $(DEP_OXRIDL) $(DEP_ZOG) $(DEP_REP) $(DEP_GLADE) + +MLDEPS := $(filter %.d, $(ALL_DEPS)) +MLIDEPS := $(filter %.di, $(ALL_DEPS)) +BCDEPIS := $(MLIDEPS:%.di=$(BCDIDIR)/%.di) +NCDEPIS := $(MLIDEPS:%.di=$(NCDIDIR)/%.di) + +ALLML := $(filter %.mli %.ml %.mll %.mly %.idl %.oxridl %.rep %.zog %.glade, $(FILTERED)) + +IMPLO_INTF := $(ALLML:%.mli=%.mli.__) +IMPLO_INTF := $(foreach file, $(IMPLO_INTF), \ + $(basename $(file)).cmi $(basename $(file)).cmo) +IMPLO_INTF := $(filter-out %.mli.cmo, $(IMPLO_INTF)) +IMPLO_INTF := $(IMPLO_INTF:%.mli.cmi=%.cmi) + +IMPLX_INTF := $(IMPLO_INTF:.cmo=.cmx) + +INTF := $(filter %.cmi, $(IMPLO_INTF)) +IMPL_CMO := $(filter %.cmo, $(IMPLO_INTF)) +IMPL_CMX := $(IMPL_CMO:.cmo=.cmx) +IMPL_ASM := $(IMPL_CMO:.cmo=.asm) +IMPL_S := $(IMPL_CMO:.cmo=.s) + +OBJ_LINK := $(OBJ_C_IDL) $(OBJ_C_CXX) +OBJ_FILES := $(IMPL_CMO:.cmo=.$(EXT_OBJ)) $(OBJ_LINK) + +EXECS := $(addsuffix $(EXE), \ + $(sort $(TOPRESULT) $(BCRESULT) $(NCRESULT))) +ifdef WIN32 + EXECS += $(BCRESULT).dll $(NCRESULT).dll +endif + +CLIB_BASE := $(RESULT)$(RES_CLIB_SUF) +ifneq ($(strip $(OBJ_LINK)),) + RES_CLIB := lib$(CLIB_BASE).$(EXT_LIB) +endif + +ifdef WIN32 +DLLSONAME := $(CLIB_BASE).dll +else +DLLSONAME := dll$(CLIB_BASE).so +endif + +NONEXECS := $(INTF) $(IMPL_CMO) $(IMPL_CMX) $(IMPL_ASM) $(IMPL_S) \ + $(OBJ_FILES) $(PRE_TARGETS) $(BCRESULT).cma $(NCRESULT).cmxa \ + $(NCRESULT).$(EXT_LIB) $(BCRESULT).cmi $(BCRESULT).cmo \ + $(NCRESULT).cmi $(NCRESULT).cmx $(NCRESULT).o \ + $(RES_CLIB) $(IMPL_CMO:.cmo=.annot) \ + $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(LIB_PACK_NAME).cmx $(LIB_PACK_NAME).o + +ifndef STATIC + NONEXECS += $(DLLSONAME) +endif + +ifndef LIBINSTALL_FILES + LIBINSTALL_FILES := $(RESULT).mli $(RESULT).cmi $(RESULT).cma \ + $(RESULT).cmxa $(RESULT).$(EXT_LIB) $(RES_CLIB) + ifndef STATIC + ifneq ($(strip $(OBJ_LINK)),) + LIBINSTALL_FILES += $(DLLSONAME) + endif + endif +endif + +export LIBINSTALL_FILES + +ifdef WIN32 + # some extra stuff is created while linking DLLs + NONEXECS += $(BCRESULT).$(EXT_LIB) $(BCRESULT).exp $(NCRESULT).exp $(CLIB_BASE).exp $(CLIB_BASE).lib +endif + +TARGETS := $(EXECS) $(NONEXECS) + +# If there are IDL-files +ifneq ($(strip $(FILTERED_IDL)),) + MAYBE_IDL := -cclib -lcamlidl +endif + +ifdef USE_CAMLP4 + CAMLP4PATH := \ + $(shell $(CAMLP4) -where 2>/dev/null || echo /usr/lib/camlp4) + INCFLAGS := -I $(CAMLP4PATH) + CINCFLAGS := -I$(CAMLP4PATH) +endif + +DINCFLAGS := $(INCFLAGS) $(SOURCE_DIRS:%=-I %) $(OCAML_DEFAULT_DIRS:%=-I %) +INCFLAGS := $(DINCFLAGS) $(INCDIRS:%=-I %) +CINCFLAGS += $(SOURCE_DIRS:%=-I%) $(INCDIRS:%=-I%) $(OCAML_DEFAULT_DIRS:%=-I%) + +ifndef MSVC +CLIBFLAGS += $(SOURCE_DIRS:%=-L%) $(LIBDIRS:%=-L%) \ + $(EXTLIBDIRS:%=-L%) $(EXTLIBDIRS:%=-Wl,$(RPATH_FLAG)%) \ + $(OCAML_DEFAULT_DIRS:%=-L%) +endif + +ifndef PROFILING + INTF_OCAMLC := $(OCAMLC) +else + ifndef THREADS + INTF_OCAMLC := $(OCAMLCP) -p $(OCAMLCPFLAGS) + else + # OCaml does not support profiling byte code + # with threads (yet), therefore we force an error. + ifndef REAL_OCAMLC + $(error Profiling of multithreaded byte code not yet supported by OCaml) + endif + INTF_OCAMLC := $(OCAMLC) + endif +endif + +ifndef MSVC +COMMON_LDFLAGS := $(LDFLAGS:%=-ccopt %) $(SOURCE_DIRS:%=-ccopt -L%) \ + $(LIBDIRS:%=-ccopt -L%) $(EXTLIBDIRS:%=-ccopt -L%) \ + $(EXTLIBDIRS:%=-ccopt -Wl,$(RPATH_FLAG)%) \ + $(OCAML_DEFAULT_DIRS:%=-ccopt -L%) +else +COMMON_LDFLAGS := -ccopt "/link -NODEFAULTLIB:LIBC $(LDFLAGS:%=%) $(SOURCE_DIRS:%=-LIBPATH:%) \ + $(LIBDIRS:%=-LIBPATH:%) $(EXTLIBDIRS:%=-LIBPATH:%) \ + $(OCAML_DEFAULT_DIRS:%=-LIBPATH:%) " +endif + +CLIBS_OPTS := $(CLIBS:%=-cclib -l%) +ifdef MSVC + ifndef STATIC + # MSVC libraries do not have 'lib' prefix + CLIBS_OPTS := $(CLIBS:%=-cclib %.lib) + endif +endif + +ifneq ($(strip $(OBJ_LINK)),) + ifdef CREATE_LIB + OBJS_LIBS := -cclib -l$(CLIB_BASE) $(CLIBS_OPTS) $(MAYBE_IDL) + else + OBJS_LIBS := $(OBJ_LINK) $(CLIBS_OPTS) $(MAYBE_IDL) + endif +else + OBJS_LIBS := $(CLIBS_OPTS) $(MAYBE_IDL) +endif + +# If we have to make byte-code +ifndef REAL_OCAMLC + BYTE_OCAML := y + + # EXTRADEPS is added dependencies we have to insert for all + # executable files we generate. Ideally it should be all of the + # libraries we use, but it's hard to find the ones that get searched on + # the path since I don't know the paths built into the compiler, so + # just include the ones with slashes in their names. + EXTRADEPS := $(addsuffix .cma,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i)))) + SPECIAL_OCAMLFLAGS := $(OCAMLBCFLAGS) + + REAL_OCAMLC := $(INTF_OCAMLC) + + REAL_IMPL := $(IMPL_CMO) + REAL_IMPL_INTF := $(IMPLO_INTF) + IMPL_SUF := .cmo + + DEPFLAGS := + MAKE_DEPS := $(MLDEPS) $(BCDEPIS) + + ifdef CREATE_LIB + CFLAGS := $(PIC_CFLAGS) $(CFLAGS) + CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS) + ifndef STATIC + ifneq ($(strip $(OBJ_LINK)),) + MAKEDLL := $(DLLSONAME) + ALL_LDFLAGS := -dllib $(DLLSONAME) + endif + endif + endif + + ifndef NO_CUSTOM + ifneq "$(strip $(OBJ_LINK) $(THREADS) $(MAYBE_IDL) $(CLIBS))" "" + ALL_LDFLAGS += -custom + endif + endif + + ALL_LDFLAGS += $(INCFLAGS) $(OCAMLLDFLAGS) $(OCAMLBLDFLAGS) \ + $(COMMON_LDFLAGS) $(LIBS:%=%.cma) + CAMLIDLDLLFLAGS := + + ifdef THREADS + ifdef VMTHREADS + THREAD_FLAG := -vmthread + else + THREAD_FLAG := -thread + endif + ifndef CREATE_LIB + ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS) + ifndef REAL_OCAMLFIND + ALL_LDFLAGS := unix.cma threads.cma $(ALL_LDFLAGS) + endif + endif + endif + +# we have to make native-code +else + EXTRADEPS := $(addsuffix .cmxa,$(foreach i,$(LIBS),$(if $(findstring /,$(i)),$(i)))) + ifndef PROFILING + SPECIAL_OCAMLFLAGS := $(OCAMLNCFLAGS) + PLDFLAGS := + else + SPECIAL_OCAMLFLAGS := -p $(OCAMLNCFLAGS) + PLDFLAGS := -p + endif + + REAL_IMPL := $(IMPL_CMX) + REAL_IMPL_INTF := $(IMPLX_INTF) + IMPL_SUF := .cmx + + CPPFLAGS := -DNATIVE_CODE $(CPPFLAGS) + + DEPFLAGS := -native + MAKE_DEPS := $(MLDEPS) $(NCDEPIS) + + ALL_LDFLAGS := $(PLDFLAGS) $(INCFLAGS) $(OCAMLLDFLAGS) \ + $(OCAMLNLDFLAGS) $(COMMON_LDFLAGS) + CAMLIDLDLLFLAGS := -opt + + ifndef CREATE_LIB + ALL_LDFLAGS += $(LIBS:%=%.cmxa) + else + CFLAGS := $(PIC_CFLAGS) $(CFLAGS) + CPPFLAGS := $(PIC_CPPFLAGS) $(CPPFLAGS) + endif + + ifdef THREADS + THREAD_FLAG := -thread + ifndef CREATE_LIB + ALL_LDFLAGS := $(THREAD_FLAG) $(ALL_LDFLAGS) + ifndef REAL_OCAMLFIND + ALL_LDFLAGS := unix.cmxa threads.cmxa $(ALL_LDFLAGS) + endif + endif + endif +endif + +export MAKE_DEPS + +ifdef ANNOTATE + ANNOT_FLAG := -dtypes +else +endif + +ALL_OCAMLCFLAGS := $(THREAD_FLAG) $(ANNOT_FLAG) $(OCAMLFLAGS) \ + $(INCFLAGS) $(SPECIAL_OCAMLFLAGS) + +ifdef make_deps + -include $(MAKE_DEPS) + PRE_TARGETS := +endif + +########################################################################### +# USER RULES + +# Call "OCamlMakefile QUIET=" to get rid of all of the @'s. +QUIET=@ + +# generates byte-code (default) +byte-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \ + REAL_RESULT="$(BCRESULT)" make_deps=yes +bc: byte-code + +byte-code-nolink: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \ + REAL_RESULT="$(BCRESULT)" make_deps=yes +bcnl: byte-code-nolink + +top: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(TOPRESULT) \ + REAL_RESULT="$(BCRESULT)" make_deps=yes + +# generates native-code + +native-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + make_deps=yes +nc: native-code + +native-code-nolink: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + make_deps=yes +ncnl: native-code-nolink + +# generates byte-code libraries +byte-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(BCRESULT).cma \ + REAL_RESULT="$(BCRESULT)" \ + CREATE_LIB=yes \ + make_deps=yes +bcl: byte-code-library + +# generates native-code libraries +native-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(NCRESULT).cmxa \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + CREATE_LIB=yes \ + make_deps=yes +ncl: native-code-library + +ifdef WIN32 +# generates byte-code dll +byte-code-dll: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(BCRESULT).dll \ + REAL_RESULT="$(BCRESULT)" \ + make_deps=yes +bcd: byte-code-dll + +# generates native-code dll +native-code-dll: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(NCRESULT).dll \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + make_deps=yes +ncd: native-code-dll +endif + +# generates byte-code with debugging information +debug-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \ + REAL_RESULT="$(BCRESULT)" make_deps=yes \ + OCAMLFLAGS="-g $(OCAMLFLAGS)" \ + OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)" +dc: debug-code + +debug-code-nolink: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) nolink \ + REAL_RESULT="$(BCRESULT)" make_deps=yes \ + OCAMLFLAGS="-g $(OCAMLFLAGS)" \ + OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)" +dcnl: debug-code-nolink + +# generates byte-code libraries with debugging information +debug-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(BCRESULT).cma \ + REAL_RESULT="$(BCRESULT)" make_deps=yes \ + CREATE_LIB=yes \ + OCAMLFLAGS="-g $(OCAMLFLAGS)" \ + OCAMLLDFLAGS="-g $(OCAMLLDFLAGS)" +dcl: debug-code-library + +# generates byte-code for profiling +profiling-byte-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT) \ + REAL_RESULT="$(BCRESULT)" PROFILING="y" \ + make_deps=yes +pbc: profiling-byte-code + +# generates native-code + +profiling-native-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(NCRESULT) \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + PROFILING="y" \ + make_deps=yes +pnc: profiling-native-code + +# generates byte-code libraries +profiling-byte-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(BCRESULT).cma \ + REAL_RESULT="$(BCRESULT)" PROFILING="y" \ + CREATE_LIB=yes \ + make_deps=yes +pbcl: profiling-byte-code-library + +# generates native-code libraries +profiling-native-code-library: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(RES_CLIB) $(NCRESULT).cmxa \ + REAL_RESULT="$(NCRESULT)" PROFILING="y" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + CREATE_LIB=yes \ + make_deps=yes +pncl: profiling-native-code-library + +# packs byte-code objects +pack-byte-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) $(BCRESULT).cmo \ + REAL_RESULT="$(BCRESULT)" \ + PACK_LIB=yes make_deps=yes +pabc: pack-byte-code + +# packs native-code objects +pack-native-code: $(PRE_TARGETS) + $(QUIET)$(MAKE) -r -f $(OCAMLMAKEFILE) \ + $(NCRESULT).cmx $(NCRESULT).o \ + REAL_RESULT="$(NCRESULT)" \ + REAL_OCAMLC="$(OCAMLOPT)" \ + PACK_LIB=yes make_deps=yes +panc: pack-native-code + +# generates HTML-documentation +htdoc: doc/$(RESULT)/html + +# generates Latex-documentation +ladoc: doc/$(RESULT)/latex + +# generates PostScript-documentation +psdoc: doc/$(RESULT)/latex/doc.ps + +# generates PDF-documentation +pdfdoc: doc/$(RESULT)/latex/doc.pdf + +# generates all supported forms of documentation +doc: htdoc ladoc psdoc pdfdoc + +########################################################################### +# LOW LEVEL RULES + +$(REAL_RESULT): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) \ + $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \ + $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@$(EXE) \ + $(REAL_IMPL) + +nolink: $(REAL_IMPL_INTF) $(OBJ_LINK) + +ifdef WIN32 +$(REAL_RESULT).dll: $(REAL_IMPL_INTF) $(OBJ_LINK) + $(CAMLIDLDLL) $(CAMLIDLDLLFLAGS) $(OBJ_LINK) $(CLIBS) \ + -o $@ $(REAL_IMPL) +endif + +%$(TOPSUFFIX): $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) + $(REAL_OCAMLFIND) $(OCAMLMKTOP) \ + $(OCAML_FIND_PACKAGES) $(OCAML_FIND_LINKPKG) \ + $(ALL_LDFLAGS) $(OBJS_LIBS) -o $@$(EXE) \ + $(REAL_IMPL) + +.SUFFIXES: .mli .ml .cmi .cmo .cmx .cma .cmxa .$(EXT_OBJ) \ + .mly .di .d .$(EXT_LIB) .idl %.oxridl .c .$(EXT_CXX) .h .so \ + .rep .zog .glade + +ifndef STATIC +ifdef MINGW +$(DLLSONAME): $(OBJ_LINK) + $(CC) $(CFLAGS) $(CFLAGS_WIN32) $(OBJ_LINK) -shared -o $@ \ + -Wl,--whole-archive $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/lib%.a))) \ + $(OCAMLLIBPATH)/ocamlrun.a \ + -Wl,--export-all-symbols \ + -Wl,--no-whole-archive +else +ifdef MSVC +$(DLLSONAME): $(OBJ_LINK) + link /NOLOGO /DLL /OUT:$@ $(OBJ_LINK) \ + $(wildcard $(foreach dir,$(LIBDIRS),$(CLIBS:%=$(dir)/%.lib))) \ + $(OCAMLLIBPATH)/ocamlrun.lib + +else +$(DLLSONAME): $(OBJ_LINK) + $(OCAMLMKLIB) $(INCFLAGS) $(CLIBFLAGS) \ + -o $(CLIB_BASE) $(OBJ_LINK) $(CLIBS:%=-l%) \ + $(OCAMLMKLIB_FLAGS) +endif +endif +endif + +ifndef LIB_PACK_NAME +$(RESULT).cma: $(REAL_IMPL_INTF) $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(ALL_LDFLAGS) \ + $(OBJS_LIBS) -o $@ $(OCAMLBLDFLAGS) $(REAL_IMPL) + +$(RESULT).cmxa $(RESULT).$(EXT_LIB): $(REAL_IMPL_INTF) $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(ALL_LDFLAGS) $(OBJS_LIBS) \ + $(OCAMLNLDFLAGS) -o $@ $(REAL_IMPL) +else +ifdef BYTE_OCAML +$(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo: $(REAL_IMPL_INTF) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack -o $(LIB_PACK_NAME).cmo $(REAL_IMPL) +else +$(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx: $(REAL_IMPL_INTF) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack -o $(LIB_PACK_NAME).cmx $(REAL_IMPL) +endif + +$(RESULT).cma: $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmo $(MAKEDLL) $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -a $(ALL_LDFLAGS) \ + $(OBJS_LIBS) -o $@ $(OCAMLBLDFLAGS) $(LIB_PACK_NAME).cmo + +$(RESULT).cmxa $(RESULT).$(EXT_LIB): $(LIB_PACK_NAME).cmi $(LIB_PACK_NAME).cmx $(EXTRADEPS) $(RESULTDEPS) + $(REAL_OCAMLFIND) $(OCAMLOPT) -a $(ALL_LDFLAGS) $(OBJS_LIBS) \ + $(OCAMLNLDFLAGS) -o $@ $(LIB_PACK_NAME).cmx +endif + +$(RES_CLIB): $(OBJ_LINK) +ifndef MSVC + ifneq ($(strip $(OBJ_LINK)),) + $(AR) rcs $@ $(OBJ_LINK) + endif +else + ifneq ($(strip $(OBJ_LINK)),) + lib -nologo -debugtype:cv -out:$(RES_CLIB) $(OBJ_LINK) + endif +endif + +.mli.cmi: $(EXTRADEPS) + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c $(THREAD_FLAG) $(ANNOT_FLAG) \ + $(OCAMLFLAGS) $(INCFLAGS) $<; \ + $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c $(THREAD_FLAG) $(ANNOT_FLAG) \ + $(OCAMLFLAGS) $(INCFLAGS) $<; \ + else \ + echo $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c -pp \"$$pp $(PPFLAGS)\" $(THREAD_FLAG) $(ANNOT_FLAG) \ + $(OCAMLFLAGS) $(INCFLAGS) $<; \ + $(REAL_OCAMLFIND) $(INTF_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c -pp "$$pp $(PPFLAGS)" $(THREAD_FLAG) $(ANNOT_FLAG) \ + $(OCAMLFLAGS) $(INCFLAGS) $<; \ + fi + +.ml.cmi .ml.$(EXT_OBJ) .ml.cmx .ml.cmo: $(EXTRADEPS) + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c $(ALL_OCAMLCFLAGS) $<; \ + $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c $(ALL_OCAMLCFLAGS) $<; \ + else \ + echo $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c -pp \"$$pp $(PPFLAGS)\" $(ALL_OCAMLCFLAGS) $<; \ + $(REAL_OCAMLFIND) $(REAL_OCAMLC) $(OCAML_FIND_PACKAGES) \ + -c -pp "$$pp $(PPFLAGS)" $(ALL_OCAMLCFLAGS) $<; \ + fi + +ifdef PACK_LIB +$(REAL_RESULT).cmo $(REAL_RESULT).cmx $(REAL_RESULT).o: $(REAL_IMPL_INTF) $(OBJ_LINK) $(EXTRADEPS) + $(REAL_OCAMLFIND) $(REAL_OCAMLC) -pack $(ALL_LDFLAGS) \ + $(OBJS_LIBS) -o $@ $(REAL_IMPL) +endif + +.PRECIOUS: %.ml +%.ml: %.mll + $(OCAMLLEX) $< + +.PRECIOUS: %.ml %.mli +%.ml %.mli: %.mly + $(OCAMLYACC) $(YFLAGS) $< + +.PRECIOUS: %.ml +%.ml: %.rep + $(CAMELEON_REPORT) $(CAMELEON_REPORT_FLAGS) -gen $< + +.PRECIOUS: %.ml +%.ml: %.zog + $(CAMELEON_ZOGGY) $(CAMELEON_ZOGGY_FLAGS) -impl $< > $@ + +.PRECIOUS: %.ml +%.ml: %.glade + $(OCAML_GLADECC) $(OCAML_GLADECC_FLAGS) $< > $@ + +.PRECIOUS: %.ml %.mli +%.ml %.mli: %.oxridl + $(OXRIDL) $< + +.PRECIOUS: %.ml %.mli %_stubs.c %.h +%.ml %.mli %_stubs.c %.h: %.idl + $(CAMLIDL) $(MAYBE_IDL_HEADER) $(IDLFLAGS) \ + $(CAMLIDLFLAGS) $< + $(QUIET)if [ $(NOIDLHEADER) ]; then touch $*.h; fi + +.c.$(EXT_OBJ): + $(OCAMLC) -c -cc "$(CC)" -ccopt "$(CFLAGS) \ + $(CPPFLAGS) $(CPPFLAGS_WIN32) \ + $(CFLAGS_WIN32) $(CINCFLAGS) $(CFLAG_O)$@ " $< + +.$(EXT_CXX).$(EXT_OBJ): + $(CXX) -c $(CXXFLAGS) $(CINCFLAGS) $(CPPFLAGS) \ + -I'$(OCAMLLIBPATH)' \ + $< $(CFLAG_O)$@ + +$(MLDEPDIR)/%.d: %.ml + $(QUIET)echo making $@ from $< + $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ + $(DINCFLAGS) $< > $@; \ + else \ + $(REAL_OCAMLFIND) $(OCAMLDEP) $(OCAML_DEP_PACKAGES) \ + -pp "$$pp $(PPFLAGS)" $(DINCFLAGS) $< > $@; \ + fi + +$(BCDIDIR)/%.di $(NCDIDIR)/%.di: %.mli + $(QUIET)echo making $@ from $< + $(QUIET)if [ ! -d $(@D) ]; then mkdir -p $(@D); fi + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) $(DINCFLAGS) $< > $@; \ + else \ + $(REAL_OCAMLFIND) $(OCAMLDEP) $(DEPFLAGS) \ + -pp "$$pp $(PPFLAGS)" $(DINCFLAGS) $< > $@; \ + fi + +doc/$(RESULT)/html: $(DOC_FILES) + rm -rf $@ + mkdir -p $@ + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(OCAMLDOC) -html -d $@ $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \ + $(OCAMLDOC) -html -d $@ $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES); \ + else \ + echo $(OCAMLDOC) -pp \"$$pp $(PPFLAGS)\" -html -d $@ $(OCAMLDOCFLAGS) \ + $(INCFLAGS) $(DOC_FILES); \ + $(OCAMLDOC) -pp "$$pp $(PPFLAGS)" -html -d $@ $(OCAMLDOCFLAGS) \ + $(INCFLAGS) $(DOC_FILES); \ + fi + +doc/$(RESULT)/latex: $(DOC_FILES) + rm -rf $@ + mkdir -p $@ + $(QUIET)pp=`sed -n -e '/^#/d' -e 's/(\*pp \([^*]*\) \*)/\1/p;q' $<`; \ + if [ -z "$$pp" ]; then \ + echo $(OCAMLDOC) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) \ + $(DOC_FILES) -o $@/doc.tex; \ + $(OCAMLDOC) -latex $(OCAMLDOCFLAGS) $(INCFLAGS) $(DOC_FILES) \ + -o $@/doc.tex; \ + else \ + echo $(OCAMLDOC) -pp \"$$pp $(PPFLAGS)\" -latex $(OCAMLDOCFLAGS) \ + $(INCFLAGS) $(DOC_FILES) -o $@/doc.tex; \ + $(OCAMLDOC) -pp "$$pp $(PPFLAGS)" -latex $(OCAMLDOCFLAGS) \ + $(INCFLAGS) $(DOC_FILES) -o $@/doc.tex; \ + fi + +doc/$(RESULT)/latex/doc.ps: doc/$(RESULT)/latex + cd doc/$(RESULT)/latex && \ + $(LATEX) doc.tex && \ + $(LATEX) doc.tex && \ + $(DVIPS) $(DVIPSFLAGS) doc.dvi -o $(@F) + +doc/$(RESULT)/latex/doc.pdf: doc/$(RESULT)/latex/doc.ps + cd doc/$(RESULT)/latex && $(PS2PDF) $( Unix.file_descr array -> Unix.file_descr array -> float -> (Unix.file_descr array * Unix.file_descr array * Unix.file_descr array) = "caml_poll" + +let poll r w e timeout = + let r = Array.of_list r in + let w = Array.of_list w in + let e = Array.of_list e in + let (r, w, e) = + poll r w e timeout + in + (Array.to_list r, + Array.to_list w, + Array.to_list e) + +let select, select_fname = + match Sys.os_type with + | "Unix" -> poll, "poll" + | _ -> Unix.select, "select" + +(** [remove f l] is like [List.find f l] but also returns the result of removing + * the found element from the original list. *) +let remove f l = + let rec aux acc = function + | [] -> raise Not_found + | x::l -> if f x then x, List.rev_append acc l else aux (x::acc) l + in + aux [] l + +(** Events and tasks from the implementation point-of-view: + * we have to hide the 'a parameter. *) + +type e = { + r : fd list ; + w : fd list ; + x : fd list ; + t : float +} + +type 'a t = { + timestamp : float ; + prio : 'a ; + enrich : e -> e ; + is_ready : e -> (unit -> 'a t list) option +} + +type 'a scheduler = +{ + out_pipe : Unix.file_descr; + in_pipe : Unix.file_descr; + compare : 'a -> 'a -> int; + select_m : Mutex.t; + mutable tasks : 'a t list; + tasks_m : Mutex.t; + mutable ready : ('a * (unit -> 'a t list)) list; + ready_m : Mutex.t; + mutable queues : Condition.t list; + queues_m : Mutex.t; + mutable stop : bool; + stop_m : Mutex.t +} + +let clear_tasks s = + Mutex.lock s.tasks_m ; + s.tasks <- [] ; + Mutex.unlock s.tasks_m + +let create ?(compare=compare) () = + let out_pipe,in_pipe = Unix.pipe () in + { + out_pipe = out_pipe; + in_pipe = in_pipe; + compare = compare; + select_m = Mutex.create (); + tasks = []; + tasks_m = Mutex.create (); + ready = []; + ready_m = Mutex.create (); + queues = []; + queues_m = Mutex.create (); + stop = false; + stop_m = Mutex.create () + } + +let wake_up s = ignore (Unix.write s.in_pipe (Bytes.of_string "x") 0 1) + +module Task = +struct + (** Events and tasks from the user's point-of-view. *) + + type event = [ + | `Delay of float + | `Write of fd + | `Read of fd + | `Exception of fd + ] + + type ('a,'b) task = { + priority : 'a ; + events : 'b list ; + handler : 'b list -> ('a,'b) task list + } + let time () = Unix.gettimeofday () + + let rec t_of_task (task:('a,[ + List.fold_left + (fun e -> function + | `Delay s -> { e with t = min e.t (t0+.s) } + | `Read s -> { e with r = s::e.r } + | `Write s -> { e with w = s::e.w } + | `Exception s -> { e with x = s::e.x }) + e task.events) ; + is_ready = (fun e -> + let l = + List.filter + (fun evt -> + match (evt :> event) with + | `Delay s when time () > t0+.s -> true + | `Read s when List.mem s e.r -> true + | `Write s when List.mem s e.w -> true + | `Exception s when List.mem s e.x -> true + | _ -> false) + task.events + in + if l = [] then None else + Some (fun () -> List.map t_of_task (task.handler l))) + } + + let add_t s items = + let f item = + match item.is_ready {r=[];w=[];x=[];t=0.} with + | Some f -> + Mutex.lock s.ready_m ; + s.ready <- (item.prio,f) :: s.ready ; + Mutex.unlock s.ready_m + | None -> + Mutex.lock s.tasks_m ; + s.tasks <- item :: s.tasks ; + Mutex.unlock s.tasks_m ; + in + List.iter f items ; + wake_up s + + let add s t = add_t s [t_of_task t] +end + +open Task + +let stop s = + clear_tasks s; + Mutex.lock s.stop_m; + s.stop <- true; + Mutex.unlock s.stop_m; + wake_up s; + Mutex.lock s.ready_m; + List.iter Condition.signal s.queues; + Mutex.unlock s.ready_m + +let tmp = Bytes.create 1024 + +(** There should be only one call of #process at a time. + * Process waits for tasks to become ready, and moves ready tasks + * to the ready queue. *) +let process s log = + (* Compute the union of all events. *) + let e = + List.fold_left + (fun e t -> t.enrich e) + { r = [s.out_pipe] ; w = [] ; x = [] ; t = infinity } + s.tasks + in + (* Poll for an event. *) + let r,w,x = + let rec f () = + try + let timeout = + if e.t = infinity then -1. else max 0. (e.t -. (time ())) + in + log (Printf.sprintf "Enter %s at %f, timeout %f (%d/%d/%d)." + select_fname (time ()) timeout + (List.length e.r) (List.length e.w) (List.length e.x)) ; + let r,w,x = select e.r e.w e.x timeout in + log (Printf.sprintf "Left %s at %f (%d/%d/%d)." select_fname (time ()) + (List.length r) (List.length w) (List.length x)) ; + r,w,x + with + | Unix.Unix_error (Unix.EINTR,_,_) -> + (* [EINTR] means that select was interrupted by + * a signal before any of the selected events + * occurred and before the timeout interval expired. + * We catch it and restart.. *) + log (Printf.sprintf "Select interrupted at %f." (time ())) ; + f () + | e -> + (* Uncaught exception: + * 1) Discards all tasks currently in the loop (we do not know which + * socket caused an error). + * 2) Re-Raise e *) + clear_tasks s ; + raise e + in + f () + in + (* Empty the wake_up pipe if needed. *) + let () = + if List.mem s.out_pipe r then + (* For safety, we may absorb more than + * one write. This avoids bad situation + * when exceesive wake_up may fill up the + * pipe's write buffer, causing a wake_up + * to become blocking.. *) + ignore (Unix.read s.out_pipe tmp 0 1024) + in + (* Move ready tasks to the ready list. *) + let e = { r=r ; w=w ; x=x ; t=0. } in + Mutex.lock s.tasks_m ; + (* Split [tasks] into [r]eady and still [w]aiting. *) + let r,w = + List.fold_left + (fun (r,w) t -> + match t.is_ready e with + | Some f -> (t.prio,f)::r, w + | None -> r, t::w) + ([],[]) + s.tasks + in + s.tasks <- w ; + Mutex.unlock s.tasks_m ; + Mutex.lock s.ready_m ; + s.ready <- List.stable_sort (fun (p,_) (p',_) -> s.compare p p') (s.ready @ r) ; + Mutex.unlock s.ready_m + + (** Code for a queue to process ready tasks. + * Returns true a task was found (and hence processed). + * + * s.ready_m *must* be locked before calling + * this function, and is freed *only* + * if some task was processed. *) +let exec s (priorities:'a->bool) = + (* This assertion does not work on + * win32 because a thread can double-lock + * the same mutex.. *) + if Sys.os_type <> "Win32" then + assert(not (Mutex.try_lock s.ready_m)) ; + try + let (_,task),remaining = + remove + (fun (p,_) -> + priorities p) + s.ready + in + s.ready <- remaining ; + Mutex.unlock s.ready_m ; + add_t s (task ()) ; + true + with Not_found -> false + +exception Queue_stopped +exception Queue_processed + + (** Main loop for queues. *) +let queue ?log ?(priorities=fun _ -> true) s name = + let log = + match log with + | Some e -> e + | None -> Printf.printf "queue %s: %s\n" name + in + let c = + let c = Condition.create () in + Mutex.lock s.queues_m ; + s.queues <- c::s.queues ; + Mutex.unlock s.queues_m ; + log (Printf.sprintf "Queue #%d starting..." (List.length s.queues)) ; + c + in + (* Try to process ready tasks, otherwise try to become the master, + * or be a slave and wait for the master to get some more ready tasks. *) + let run () = + Mutex.lock s.stop_m; + let stop = s.stop in + Mutex.unlock s.stop_m; + if stop then raise Queue_stopped; + (* Lock the ready tasks until the queue has a task to proceed, + * *or* is really ready to restart on its condition, see the + * Condition.wait call below for the atomic unlock and wait. *) + Mutex.lock s.ready_m ; + log (Printf.sprintf "There are %d ready tasks." (List.length s.ready)) ; + if exec s priorities then raise Queue_processed; + let wake () = + (* Wake up other queues if there are remaining tasks *) + if s.ready <> [] then + begin + Mutex.lock s.queues_m ; + List.iter (fun x -> if x <> c then Condition.signal x) + s.queues ; + Mutex.unlock s.queues_m + end ; + in + if Mutex.try_lock s.select_m then begin + (* Processing finished for me + * I can unlock ready_m now.. *) + Mutex.unlock s.ready_m ; + process s log ; + Mutex.unlock s.select_m ; + Mutex.lock s.ready_m ; + wake () ; + Mutex.unlock s.ready_m + end else begin + (* We use s.ready_m mutex here. + * Hence, we avoid race conditions + * with any other queue being processing + * a task that would create a new task: + * without this mutex, the new task may not be + * notified to this queue if it is going to sleep + * in concurrency.. + * It also avoid race conditions when restarting + * queues since s.ready_m is locked until all + * queues have been signaled. *) + Condition.wait c s.ready_m; + Mutex.unlock s.ready_m + end + in + let rec f () = + begin + try run () with + | Queue_processed -> () + end; + (f [@tailcall]) () + in + try + f () + with Queue_stopped -> () + +module Async = +struct + (* m is used to make sure that + * calls to [wake_up] and [stop] + * are thread-safe. *) + type t = + { + stop : bool ref; + mutable fd : fd option; + m : Mutex.t + } + + exception Stopped + + let add ~priority (scheduler:'a scheduler) f = + (* A pipe to wake up the task *) + let out_pipe,in_pipe = Unix.pipe () in + let stop = ref false in + let tmp = Bytes.create 1024 in + let rec task l = + if List.exists ((=) (`Read out_pipe)) l then + (* Consume data from the pipe *) + ignore (Unix.read out_pipe tmp 0 1024) ; + if !stop then begin + begin + try + (* This interface is purely asynchronous + * so we close both sides of the pipe here. *) + Unix.close in_pipe ; + Unix.close out_pipe + with _ -> () + end ; + [] + end + else begin + let delay = f () in + let event = + if delay >= 0. then + [`Delay delay ] + else + [] + in + [{ priority = priority ; + events = `Read out_pipe :: event ; + handler = task }] + end + in + let task = + { + priority = priority ; + events = [`Read out_pipe] ; + handler = task + } + in + add scheduler task ; + { stop = stop ; fd = Some in_pipe ; + m = Mutex.create () } + + let wake_up t = + Mutex.lock t.m ; + try + begin + match t.fd with + | Some t -> ignore (Unix.write t (Bytes.of_string " ") 0 1) + | None -> raise Stopped + end ; + Mutex.unlock t.m + with + | e -> Mutex.unlock t.m; raise e + + + let stop t = + Mutex.lock t.m; + try + begin + match t.fd with + | Some c -> + t.stop := true ; + ignore (Unix.write c (Bytes.of_string " ") 0 1) + | None -> raise Stopped + end ; + t.fd <- None ; + Mutex.unlock t.m + with + | e -> Mutex.unlock t.m; raise e +end + +module type Transport_t = +sig + type t + type bigarray = (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t + val sock : t -> Unix.file_descr + val read : t -> Bytes.t -> int -> int -> int + val write : t -> Bytes.t -> int -> int -> int + val ba_write : t -> bigarray -> int -> int -> int +end + +module Unix_transport : Transport_t with type t = Unix.file_descr = +struct + type t = Unix.file_descr + type bigarray = (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t + let sock s = s + let read = Unix.read + let write = Unix.write + external ba_write : t -> bigarray -> int -> int -> int = "ocaml_duppy_write_ba" +end + +module type Io_t = +sig + type socket + type marker = Length of int | Split of string + type bigarray = (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t + type failure = + | Io_error + | Unix of Unix.error*string*string + | Unknown of exn + | Timeout + val read : + ?recursive:bool -> ?init:string -> ?on_error:(string*failure -> unit) -> + ?timeout:float -> priority:'a -> 'a scheduler -> socket -> + marker -> (string*(string option) -> unit) -> unit + val write : + ?exec:(unit -> unit) -> ?on_error:(failure -> unit) -> + ?bigarray:bigarray -> ?string:Bytes.t -> ?timeout:float -> priority:'a -> + 'a scheduler -> socket -> unit +end + +module MakeIo(Transport:Transport_t) : Io_t with type socket = Transport.t = +struct + type socket = Transport.t + type marker = Length of int | Split of string + type failure = + | Io_error + | Unix of Unix.error*string*string + | Unknown of exn + | Timeout + + exception Io + exception Timeout_exc + + type bigarray = (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t + + let read ?(recursive=false) ?(init="") ?(on_error=fun _ -> ()) + ?timeout ~priority (scheduler:'a scheduler) + socket marker exec = + let length = 1024 in + let b = Buffer.create length in + let buf = Bytes.make length ' ' in + Buffer.add_string b init ; + let unix_socket = Transport.sock socket in + let events,check_timeout = + match timeout with + | None -> [`Read unix_socket], fun _ -> false + | Some f -> [`Read unix_socket; `Delay f], + (List.mem (`Delay f)) + in + let rec f l = + if check_timeout l then + raise Timeout_exc ; + if (List.mem (`Read unix_socket) l) then + begin + let input = Transport.read socket buf 0 length in + if input<=0 then raise Io ; + Buffer.add_subbytes b buf 0 input + end ; + let ret = + match marker with + | Split r -> + let rex = Pcre.regexp r in + let acc = Buffer.contents b in + let ret = Pcre.full_split ~max:2 ~rex acc in + let rec p l = + match l with + | Pcre.Text x :: Pcre.Delim _ :: l -> + let f b x = + match x with + | Pcre.Text s + | Pcre.Delim s -> Buffer.add_string b s + | _ -> () + in + if recursive then + begin + Buffer.reset b; + List.iter (f b) l ; + Some (x,None) + end + else + begin + let b = Buffer.create 10 in + List.iter (f b) l ; + Some (x, Some (Buffer.contents b)) + end + | _ :: l' -> p l' + | [] -> None + in + p ret + | Length n when n <= Buffer.length b -> + let s = Buffer.sub b 0 n in + let rem = Buffer.sub b n (Buffer.length b - n) in + if recursive then + begin + Buffer.reset b ; + Buffer.add_string b rem ; + Some (s, None) + end + else + Some (s, Some rem) + | _ -> None + in + (* Catch all exceptions.. *) + let f x = + try + f x + with + | Io -> on_error (Buffer.contents b,Io_error); [] + | Timeout_exc -> on_error (Buffer.contents b,Timeout); [] + | Unix.Unix_error(x,y,z) -> + on_error (Buffer.contents b,Unix(x,y,z)); [] + | e -> on_error (Buffer.contents b,Unknown e); [] + in + match ret with + | Some x -> + begin + match x with + | s,Some _ when recursive -> + exec (s,None) ; + [{ priority = priority ; + events = events ; + handler = f }] + | _ -> exec x; [] + end + | None -> + [{ priority = priority ; + events = events ; + handler = f }] + in + (* Catch all exceptions.. *) + let f x = + try + f x + with + | Io -> on_error (Buffer.contents b,Io_error); [] + | Timeout_exc -> on_error (Buffer.contents b,Timeout); [] + | Unix.Unix_error(x,y,z) -> + on_error (Buffer.contents b,Unix(x,y,z)); [] + | e -> on_error (Buffer.contents b,Unknown e); [] + in + (* First one is without read, + * in case init contains the wanted match. + * Unless the user sets timeout to 0., this + * should not interfer with user-defined timeout.. *) + let task = + { + priority = priority ; + events = [`Delay 0.; `Read unix_socket] ; + handler = f + } + in + add scheduler task + + let write ?(exec=fun () -> ()) ?(on_error=fun _ -> ()) + ?bigarray ?string ?timeout ~priority + (scheduler:'a scheduler) socket = + let length,write = + match string,bigarray with + | Some s,_ -> + Bytes.length s, + Transport.write socket s + | None,Some b -> + Bigarray.Array1.dim b, + Transport.ba_write socket b + | _ -> + 0,fun _ _ -> 0 + in + let unix_socket = Transport.sock (socket:Transport.t) in + let exec () = + if Sys.os_type = "Win32" then + Unix.clear_nonblock unix_socket; + exec () + in + let events,check_timeout = + match timeout with + | None -> [`Write unix_socket], fun _ -> false + | Some f -> [`Write unix_socket; `Delay f], + (List.mem (`Delay f)) + in + let rec f pos l = + try + if check_timeout l then + raise Timeout_exc ; + assert (List.exists ((=) (`Write unix_socket)) l) ; + let len = length - pos in + let n = write pos len in + if n<=0 then (on_error Io_error ; []) + else + begin + if n < len then + [{ priority = priority ; events = [`Write unix_socket] ; + handler = f (pos+n) }] + else + (exec () ; []) + end + with + | Unix.Unix_error(Unix.EWOULDBLOCK, _, _) when Sys.os_type = "Win32" -> + [{ priority = priority ; events = [`Write unix_socket] ; + handler = f pos }] + | Timeout_exc -> on_error Timeout; [] + | Unix.Unix_error(x,y,z) -> on_error (Unix(x,y,z)); [] + | e -> on_error (Unknown e); [] + in + let task = { + priority = priority ; + events = events ; + handler = (f 0) + } in + if length > 0 then + (* Win32 is particularly bad with writting on sockets. It is nearly impossible + * to write proper non-blocking code. send will block on blocking sockets if + * there isn't enough data available instead of returning a partial buffer + * and WSAEventSelect will not return if the socket still has available space. + * Thus, setting the socket to non-blocking and writting as much as we can. *) + if Sys.os_type = "Win32" then + begin + Unix.set_nonblock unix_socket ; + List.iter (add scheduler) (f 0 [`Write unix_socket]) + end + else + add scheduler task + else + exec () +end + +module Io : Io_t with type socket = Unix.file_descr = MakeIo(Unix_transport) + +(** A monad for implicit continuations or responses *) +module Monad = +struct + type ('a,'b) handler = + { return: 'a -> unit ; + raise: 'b -> unit } + type ('a,'b) t = ('a,'b) handler -> unit + + let return x = + fun h -> h.return x + + let raise x = + fun h -> h.raise x + + let bind f g = + fun h -> + let ret x = + let process = g x in + process h + in + f { return = ret ; + raise = h.raise } + + let (>>=) = bind + + let run ~return:ret ~raise:raise f = + f { return = ret ; + raise = raise } + + let catch f g = + fun h -> + let raise x = + let process = g x in + process h + in + f { return = h.return ; + raise = raise } + + let (=<<) = fun x y -> catch y x + + let rec fold_left f a = + function + | [] -> a + | b :: l -> + fold_left f (bind a (fun a -> f a b)) l + + let fold_left f a l = fold_left f (return a) l + + let iter f l = fold_left (fun () b -> f b) () l + + module Mutex_o = Mutex + + module Mutex = + struct + module type Mutex_control = + sig + type priority + val scheduler : priority scheduler + val priority : priority + end + + module type Mutex_t = + sig + (** Type for a mutex. *) + type mutex + + module Control : Mutex_control + + (** [create ()] creates a mutex. Implementation-wise, + * a duppy task is created that will be used to select a + * waiting computation, lock the mutex on it and resume it. + * Thus, [priority] and [s] represents, resp., the priority + * and scheduler used when running calling process' computation. *) + val create : unit -> mutex + + (** A computation that locks a mutex + * and returns [unit] afterwards. Computation + * will be blocked until the mutex is sucessfuly locked. *) + val lock : mutex -> (unit,'a) t + + (** A computation that tries to lock a mutex. + * Returns immediatly [true] if the mutex was sucesfully locked + * or [false] otherwise. *) + val try_lock : mutex -> (bool,'a) t + + (** A computation that unlocks a mutex. + * Should return immediatly. *) + val unlock : mutex -> (unit,'a) t + end + + module Factory(Control:Mutex_control) = + struct + (* A mutex is either locked or not + * and has a list of tasks waiting to get + * it. *) + type mutex = + { mutable locked : bool ; + mutable tasks : ((unit->unit) list) } + + module Control = Control + + let tmp = Bytes.create 1024 + + let (x,y) = Unix.pipe () + + let stop = ref false + + let wake_up () = ignore(Unix.write y (Bytes.of_string " ") 0 1) + + let ctl_m = Mutex_o.create () + + let finalise _ = + stop := true ; + wake_up () + + let mutexes = Queue.create () + + let () = Gc.finalise finalise mutexes + + let register () = + let m = + { locked = false ; + tasks = [] } + in + Queue.push m mutexes; + m + + let cleanup m = + Mutex_o.lock ctl_m ; + let q = Queue.create () in + Queue.iter (fun m' -> if m <> m' then Queue.push m q) mutexes ; + Queue.clear mutexes ; + Queue.transfer q mutexes ; + Mutex_o.unlock ctl_m + + let task f = + { Task. + priority = Control.priority ; + events = [`Delay 0.]; + handler = (fun _ -> f (); [])} + + (* This should only be called when [ctl_m] is locked. *) + let process_mutex tasks m = + if not m.locked then + (* I don't think shuffling tasks + * matters here.. *) + match m.tasks with + | x :: l -> + m.tasks <- l ; + m.locked <- true ; + task x :: tasks + | _ -> tasks + else tasks + + let rec handler _ = + Mutex_o.lock ctl_m ; + if not !stop then + begin + let tasks = + Queue.fold process_mutex [] mutexes + in + Mutex_o.unlock ctl_m ; + ignore(Unix.read x tmp 0 1024) ; + { Task. + priority = Control.priority ; + events = [`Read x]; + handler = handler } :: tasks + end + else + begin + Mutex_o.unlock ctl_m ; + try + Unix.close x; + Unix.close y; + [] + with + | _ -> + [] + end + + let () = + Task.add Control.scheduler + { Task. + priority = Control.priority; + events = [`Read x]; + handler = handler } + + let create () = + Mutex_o.lock ctl_m ; + let ret = register () in + Mutex_o.unlock ctl_m ; + Gc.finalise cleanup ret ; + ret + + let lock m = + (fun h' -> + Mutex_o.lock ctl_m ; + if not m.locked then + begin + m.locked <- true ; + Mutex_o.unlock ctl_m ; + h'.return () + end + else + begin + m.tasks <- h'.return :: m.tasks ; + Mutex_o.unlock ctl_m + end) + + let try_lock m = + (fun h' -> + Mutex_o.lock ctl_m ; + if not m.locked then + begin + m.locked <- true ; + Mutex_o.unlock ctl_m ; + h'.return true ; + end + else + begin + Mutex_o.unlock ctl_m ; + h'.return false + end) + + let unlock m = + (fun h' -> + Mutex_o.lock ctl_m ; + (* Here we allow inter-thread + * and double unlock.. Double unlock + * is not necessarily a problem and + * inter-thread unlock well.. what is + * a thread here ?? :-) *) + m.locked <- false ; + let wake = m.tasks <> [] in + Mutex_o.unlock ctl_m ; + if wake then wake_up (); + h'.return ()) + end + end + module Condition = + struct + module Factory(Mutex : Mutex.Mutex_t) = + struct + type condition = + { condition_m : Mutex_o.t ; + waiting : (unit -> unit) Queue.t } + + module Control = Mutex.Control + + let create () = + { condition_m = Mutex_o.create (); + waiting = Queue.create () } + + (* Mutex.unlock m needs to happen _after_ + * the task has been registered. *) + let wait c m = + (fun h -> + let proc = + fun () -> Mutex.lock m h + in + Mutex_o.lock c.condition_m ; + Queue.push proc c.waiting; + Mutex_o.unlock c.condition_m ; + (* Mutex.unlock does not raise exceptions (for now..) *) + let h' = { return = (fun () -> ()); + raise = (fun _ -> assert false) } + in + Mutex.unlock m h') + + let wake_up h = + let handler _ = h (); [] in + Task.add Control.scheduler + { Task. + priority = Control.priority; + events = [`Delay 0.]; + handler = handler } + + let signal c = + (fun h -> + Mutex_o.lock c.condition_m; + let h' = Queue.pop c.waiting in + Mutex_o.unlock c.condition_m; + wake_up h'; + h.return ()) + + let broadcast c = + (fun h -> + let q = Queue.create () in + Mutex_o.lock c.condition_m; + Queue.transfer c.waiting q; + Mutex_o.unlock c.condition_m; + Queue.iter wake_up q; + h.return ()) + end + end + + module type Monad_io_t = + sig + type socket + module Io : Io_t with type socket = socket + type ('a,'b) handler = + { scheduler : 'a scheduler ; + socket : Io.socket ; + mutable data : string ; + on_error : Io.failure -> 'b } + val exec : ?delay:float -> priority:'a -> ('a,'b) handler -> + ('c,'b) t -> ('c,'b) t + val delay : priority:'a -> ('a,'b) handler -> float -> (unit,'b) t + val read : ?timeout:float -> priority:'a -> + marker:Io.marker -> ('a,'b) handler -> + (string,'b) t + val read_all : ?timeout:float -> + priority:'a -> + 'a scheduler -> + Io.socket -> (string,(string*Io.failure)) t + val write : ?timeout:float -> priority:'a -> ('a,'b) handler -> + Bytes.t -> (unit,'b) t + val write_bigarray : ?timeout:float -> priority:'a -> ('a,'b) handler -> + Io.bigarray -> (unit,'b) t + end + + module MakeIo(Io:Io_t) = + struct + type socket = Io.socket + module Io = Io + type ('a,'b) handler = + { scheduler : 'a scheduler ; + socket : Io.socket ; + mutable data : string ; + on_error : Io.failure -> 'b } + + let exec ?(delay=0.) ~priority h f = + (fun h' -> + let handler _ = + begin + try + f h' + with + | e -> h'.raise (h.on_error (Io.Unknown e)) + end ; + [] + in + Task.add h.scheduler + { Task. + priority = priority ; + events = [`Delay delay]; + handler = handler }) + + let delay ~priority h delay = + exec ~delay ~priority h (return ()) + + let read ?timeout ~priority ~marker h = + (fun h' -> + let process x = + let s = + match x with + | s, None -> + h.data <- "" ; + s + | s, Some s' -> + h.data <- s' ; + s + in + h'.return s + in + let init = h.data in + h.data <- "" ; + let on_error (s,x) = + h.data <- s ; + h'.raise (h.on_error x) + in + Io.read ?timeout ~priority ~init ~recursive:false + ~on_error h.scheduler h.socket + marker process) + + let read_all ?timeout ~priority s sock = + let handler = + { scheduler = s ; + socket = sock ; + data = "" ; + on_error = (fun e -> e) } + in + let buf = Buffer.create 1024 in + let rec f () = + let data = + read ?timeout ~priority + ~marker:(Io.Length 1024) + handler + in + let process data = + Buffer.add_string buf data ; + f () + in + data >>= process + in + let catch_ret e = + Buffer.add_string buf handler.data ; + match e with + | Io.Io_error -> return (Buffer.contents buf) + | e -> raise (Buffer.contents buf,e) + in + catch (f ()) catch_ret + + let write ?timeout ~priority h s = + (fun h' -> + let on_error x = + h'.raise (h.on_error x) + in + let exec () = + h'.return () + in + Io.write ?timeout ~priority ~on_error ~exec + ~string:s h.scheduler h.socket) + + let write_bigarray ?timeout ~priority h ba = + (fun h' -> + let on_error x = + h'.raise (h.on_error x) + in + let exec () = + h'.return () + in + Io.write ?timeout ~priority ~on_error ~exec + ~bigarray:ba h.scheduler h.socket) + end + + module Io = MakeIo(Io) +end + diff --git a/src/duppy.mli b/src/duppy.mli new file mode 100644 index 0000000..0d4a527 --- /dev/null +++ b/src/duppy.mli @@ -0,0 +1,523 @@ +(***************************************************************************** + + Duppy, a task scheduler for OCaml. + Copyright 2003-2010 Savonet team + + 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 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, fully stated in the COPYING + file at the root of the liquidsoap distribution. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + *****************************************************************************) + + (** Advanced scheduler and monad for server-oriented programming. *) + + (** + * {R {i {v + * The bars could not hold me; + * Force could not control me now. + * They try to keep me down, yeah! + * But Jah put I around. + * (...) + * Let me tell you this - + * I'm a duppy conqueror ! + * v} } } + * {R {b Lee "Scratch" Perry & Bob Marley - Duppy conqueror }} + * + * {2 Duppy task scheduler for OCaml.} + * + * {!Duppy} is a task scheduler for ocaml. It implements a wrapper + * around [Unix.select]. + * + * Using {!Duppy.Task}, the programmer can easily submit tasks that need to wait + * on a socket even, or for a given timeout (possibly zero). + * + * With {!Duppy.Async}, one can use a scheduler to submit asynchronous tasks. + * + * {!Duppy.Io} implements recursive easy reading and writing to a [Unix.file_descr] + * + * Finally, {!Duppy.Monad} and {!Duppy.Monad.Io} provide a monadic interface to + * program server code that with an implicit return/reply execution flow. + * + * The scheduler can use several queues running concurently, each queue + * processing ready tasks. Of course, a queue should run in its own thread.*) + +(** A scheduler is a device for processing tasks. Several queues might run in + * different threads, processing one scheduler's tasks. + * + * ['a] is the type of objects used for priorities. *) +type 'a scheduler + +(** Initiate a new scheduler + * @param compare the comparison function used to sort tasks according to priorities. + * Works as in [List.sort] *) +val create : ?compare:('a -> 'a -> int) -> unit -> 'a scheduler + +(** [queue ~log ~priorities s name] + * starts a queue, on the scheduler [s] only processing priorities [p] + * for which [priorities p] returns [true]. + * + * Several queues can be run concurrently against [s]. + * @param log Logging function. Default: [Printf.printf "queue %s: %s\n" name] + * @param priorities Predicate specifying which priority to process. Default: [fun _ -> _ -> true] + * + * An exception is raised from this call when duppy's event loops has + * crashed. This exception should be considered a MAJOR FAILURE. All current + * non-ready tasks registered for the calling scheduler are dropped. You may + * restart Duppy's queues after it is raised but it should only be used to terminate + * the process diligently!! *) +val queue : + ?log:(string -> unit) -> ?priorities:('a -> bool) -> + 'a scheduler -> string -> unit + +(** Stop all queues running on that scheduler, causing them to return. *) +val stop : 'a scheduler -> unit + +(** Core task registration. + * + * A task will be a set of events to watch, and a corresponding function to + * execute when one of the events is trigered. + * + * The executed function may then return a list of new tasks to schedule. *) +module Task : +sig + + (** A task is a list of events awaited, + * and a function to process events that have occured. + * + * The ['a] parameter is the type of priorities, ['b] will be a subset of possible + * events. *) + type ('a,'b) task = { + priority : 'a ; + events : 'b list ; + handler : 'b list -> ('a,'b) task list + } + + (** Type for possible events. + * + * Please not that currently, under win32, all socket used in ocaml-duppy + * are expected to be in blocking mode only! *) + type event = [ + | `Delay of float + | `Write of Unix.file_descr + | `Read of Unix.file_descr + | `Exception of Unix.file_descr + ] + + (** Schedule a task. *) + val add : + 'a scheduler -> ('a,[< event ]) task -> unit +end + +(** Asynchronous task module + * + * This module implements an asychronous API to {!Duppy.scheduler} + * It allows to create a task that will run and then go to sleep. *) +module Async : +sig + + type t + + (** Exception raised when trying to wake_up a task + * that has been previously stopped *) + exception Stopped + + (** [add ~priority s f] creates an asynchronous task in [s] with + * priority [priority]. + * + * The task executes the function [f]. + * If the task returns a positive float, the function will be executed + * again after this delay. Otherwise it goes to sleep, and + * you can use [wake_up] to resume the task and execute [f] again. + * Only a single call to [f] is done at each time. + * Multiple [wake_up] while previous task has not + * finished will result in sequentialized calls to [f]. *) + val add : priority:'a -> 'a scheduler -> (unit -> float) -> t + + (** Wake up an asynchronous task. + * Raises [Stopped] if the task has been stopped. *) + val wake_up : t -> unit + + (** Stop and remove the asynchronous task. Doesn't quit a running task. + * Raises [Stopped] if the task has been stopped. *) + val stop : t -> unit +end + +(** Module type for Io functor. *) +module type Transport_t = +sig + type t + type bigarray = (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t + val sock : t -> Unix.file_descr + val read : t -> Bytes.t -> int -> int -> int + val write : t -> Bytes.t -> int -> int -> int + val ba_write : t -> bigarray -> int -> int -> int +end + +(** Easy parsing of [Unix.file_descr]. + * + * With {!Duppy.Io.read}, you can pass a file descriptor to the scheduler, + * along with a marker, and have it run the associated function when the + * marker is found. + * + * With {!Duppy.Io.write}, the schdeduler will try to write recursively to the file descriptor + * the given string. *) +module type Io_t = +sig + + type socket + + (** Type for markers. + * + * [Split s] recognizes all regexp allowed by the + * [Pcre] module. *) + type marker = Length of int | Split of string + + (** Type of [Bigarray] used here. *) + type bigarray = (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t + + (** Different types of failure. + * + * [Io_error] is raised when reading or writing + * returned 0. This usually means that the socket + * was closed. *) + type failure = + | Io_error + | Unix of Unix.error*string*string + | Unknown of exn + | Timeout + + (** Wrapper to perform a read on a socket and trigger a function when + * a marker has been detected, or enough data has been read. + * It reads recursively on a socket, splitting into strings seperated + * by the marker (if any) and calls the given function on the list of strings. + * + * Can be used recursively or not, depending on the way you process strings. + * Because of Unix's semantic, it is not possible to stop reading + * at first marker, so there can be a remaining string. If not used + * recursively, the second optional argument may contain a remaining + * string. You should then initiate the next read with this value. + * + * The [on_error] function is used when reading failed on the socket. + * Depending on your usage, it can be a hard failure, or simply a lost client. + * The string passed to [on_error] contains data read before error + * occured. + * @param recursive recursively read and process, default: [true] + * @param init initial string for reading, default: [""] + * @param on_error function used when read failed, default: [fun _ -> ()] + * @param timeout Terminate with [Timeout] failure if nothing has been read + * after the given amout of time in seconds. More precisely, + * the exception is raised when no character have been read + * and the socket was not close while waiting. Default: wait + * forever. *) + val read : + ?recursive:bool -> ?init:string -> ?on_error:(string*failure -> unit) -> + ?timeout:float -> priority:'a -> 'a scheduler -> socket -> + marker -> (string*(string option) -> unit) -> unit + + (** Similar to [read] but less complex. + * [write ?exec ?on_error ?string ?bigarray ~priority scheduler socket] + * write data from [string], or from [bigarray] if no string is given, + * to [socket], and executes [exec] or [on_error] if errors occured. + * + * Caveat: on Win32, all file descriptors are expected to be in blocking + * mode before being passed to this call due to limitations in the emulation + * of the unix/posix API. See code comments for more details. + * + * @param exec function to execute after writing, default: [fun () -> ()] + * @param on_error function to execute when an error occured, default: [fun _ -> ()] + * @param string write data from this string + * @param bigarray write data from this bigarray, if no [string] is given + * @param timeout Terminate with [Timeout] failure if nothing has been written + * after the given amout of time in seconds. More precisely, + * the exception is raised when no character have been written + * and the socket was not close while waiting. Default: wait + * forever. *) + val write : + ?exec:(unit -> unit) -> ?on_error:(failure -> unit) -> + ?bigarray:bigarray -> ?string:Bytes.t -> ?timeout:float -> priority:'a -> + 'a scheduler -> socket -> unit +end + +module MakeIo : functor (Transport : Transport_t) -> Io_t with type socket = Transport.t + +module Io : Io_t with type socket = Unix.file_descr + +(** Monadic interface to {!Duppy.Io}. + * + * This module can be used to write code + * that runs in various Duppy's tasks and + * raise values in a completely transparent way. + * + * You can see examples of its use + * in the [examples/] directory of the + * source code and in the files + * [src/tools/{harbor.camlp4,server.camlp4}] + * in liquidsoap's code. + * + * When a server communicates + * with a client, it performs several + * computations and, eventually, terminates. + * A computation can either return a new + * value or terminate. For instance: + * + * - Client connects. + * - Server tries to authenticate the client. + * - If authentication is ok, proceed with the next step. + * - Otherwise terminate. + * + * The purpose of the monad is to embed + * computations which can either return + * a new value or raise a value that is used + * to terminate. *) +module Monad : +sig + + (** Type representing a computation + * which returns a value of type ['a] + * or raises a value of type ['b] *) + type ('a,'b) t + + (** [return x] create a computation that + * returns value [x]. *) + val return : 'a -> ('a,'b) t + + (** [raise x] create a computation that raises + * value [x]. *) + val raise : 'b -> ('a,'b) t + + (** Compose two computations. + * [bind f g] is equivalent to: + * [let x = f in g x] where [x] + * has f's return type. *) + val bind : ('a,'b) t -> ('a -> ('c,'b) t) -> ('c,'b) t + + (** [>>=] is an alternative notation + * for [bind] *) + val (>>=) : ('a,'b) t -> ('a -> ('c,'b) t) -> ('c,'b) t + + (** [run f ~return ~raise ()] executes [f] and process + * returned values with [return] or raised values + * with [raise]. *) + val run : return:('a -> unit) -> raise:('b -> unit) -> ('a,'b) t -> unit + + (** [catch f g] redirects values [x] raised during + * [f]'s execution to [g]. The name suggests the + * usual [try .. with ..] exception catching. *) + val catch : ('a,'b) t -> ('b -> ('a,'c) t) -> ('a,'c) t + + (** [=<<] is an alternative notation for catch. *) + val (=<<) : ('b -> ('a,'c) t) -> ('a,'b) t -> ('a,'c) t + + (** [fold_left f a [b1; b2; ..]] returns computation + * [ (f a b1) >>= (fun a -> f a b2) >>= ...] *) + val fold_left : ('a -> 'b -> ('a,'c) t) -> 'a -> 'b list -> ('a,'c) t + + (** [iter f [x1; x2; ..]] returns computation + * [f x1 >>= (fun () -> f x2) >>= ...] *) + val iter : ('a -> (unit,'b) t) -> 'a list -> (unit,'b) t + + (** This module implements monadic + * mutex computations. They can be used + * to write blocking code that is compatible + * with duppy's tasks, i.e. [Mutex.lock m] blocks + * the calling computation and not the calling thread. *) + module Mutex : + sig + (** Information used to initialize a Mutex module. + * [priority] and [scheduler] are used to initialize a task + * which treat mutexes as well as conditions from the below + * [Condition] module. *) + module type Mutex_control = + sig + type priority + val scheduler : priority scheduler + val priority : priority + end + + module type Mutex_t = + sig + (** Type for a mutex. *) + type mutex + + module Control : Mutex_control + + (** [create ()] creates a mutex. *) + val create : unit -> mutex + + (** A computation that locks a mutex + * and returns [unit] afterwards. Computation + * will be blocked until the mutex is sucessfuly locked. *) + val lock : mutex -> (unit,'a) t + + (** A computation that tries to lock a mutex. + * Returns immediatly [true] if the mutex was sucesfully locked + * or [false] otherwise. *) + val try_lock : mutex -> (bool,'a) t + + (** A computation that unlocks a mutex. + * Should return immediatly. *) + val unlock : mutex -> (unit,'a) t + end + + module Factory(Control : Mutex_control) : Mutex_t + end + + (** This module implements monadic + * condition computations. They can be used + * to write waiting code that is compatible + * with duppy's tasks, i.e. [Condition.wait c m] blocks + * the calling computation and not the calling thread + * until [Condition.signal c] or [Condition.broadcast c] has + * been called. *) + module Condition : + sig + module Factory(Mutex : Mutex.Mutex_t) : + sig + (** Type of a condition, used in [wait] and [broadcast] *) + type condition + + (** Create a condition. Implementation-wise, + * a duppy task is created that will be used to select a + * waiting computation, and resume it. + * Thus, [priority] and [s] represents, resp., the priority + * and scheduler used when running calling process' computation. *) + val create : unit -> condition + + (** [wait h m] is a computation that: + * {ul + * {- Unlock mutex [m]} + * {- Wait until [Condition.signal c] or [Condition.broadcast c] + has been called} + * {- Locks mutex [m]} + * {- Returns [unit]}} *) + val wait : condition -> Mutex.mutex -> (unit,'a) t + + (** [broadcast c] is a computation that + * resumes all computations waiting on [c]. It should + * return immediately. *) + val broadcast : condition -> (unit,'a) t + + (** [signal c] is a computation that resumes one + * computation waiting on [c]. It should return + * immediately. *) + val signal : condition -> (unit,'a) t + end + end + + (** This module implements monadic computations + * using [Duppy.Io]. It can be used to create + * computations that read or write from a socket, + * and also to redirect a computation in a different + * queue with a new priority. *) + module type Monad_io_t = + sig + type socket + + module Io : Io_t with type socket = socket + + (** {2 Type } *) + + (** A handler for this module + * is a record that contains the + * required elements. In particular, + * [on_error] is a function that transforms + * an error raised by [Duppy.Io] to a reply + * used to terminate the computation. + * [data] is an internal data buffer. It should + * be initialized with [""]. It contains the + * remaining data that was received when + * using [read]. If an error occured, + * [data] contain data read before the + * error. *) + type ('a,'b) handler = + { scheduler : 'a scheduler ; + socket : Io.socket ; + mutable data : string ; + on_error : Io.failure -> 'b } + + (** {2 Execution flow } *) + + (** [exec ?delay ~priority h f] redirects computation + * [f] into a new queue with priority [priority] and + * delay [delay] ([0.] by default). + * It can be used to redirect a computation that + * has to run under a different priority. For instance, + * a computation that reads from a socket is generally + * not blocking because the function is executed + * only when some data is available for reading. + * However, if the data that is read needs to be processed + * by a computation that can be blocking, then one may + * use [exec] to redirect this computation into an + * appropriate queue. *) + val exec : ?delay:float -> priority:'a -> ('a,'b) handler -> + ('c,'b) t -> ('c,'b) t + + (** [delay ~priority h d] creates a computation that returns + * [unit] after delay [d] in seconds. *) + val delay : priority:'a -> ('a,'b) handler -> float -> (unit,'b) t + + (** {2 Read/write } *) + + (** [read ?timeout ~priority ~marker h] creates a + * computation that reads from [h.socket] + * and returns the first string split + * according to [marker]. This function + * can be used to create a computation that + * reads data from a socket. [timeout] parameter + * forces the computation to return an error if + * nothing has been read for more than [timeout] + * seconds. Default: wait forever. *) + val read : ?timeout:float -> priority:'a -> + marker:Io.marker -> ('a,'b) handler -> + (string,'b) t + + (** [read_all ?timeout ~priority s sock] creates a + * computation that reads all data from [sock] + * and returns it. Raised value contains data + * read before an error occured. *) + val read_all : ?timeout:float -> + priority:'a -> + 'a scheduler -> + Io.socket -> (string,(string*Io.failure)) t + + (** [write ?timeout ~priority h s] creates a computation + * that writes string [s] to [h.socket]. This + * function can be used to create a computation + * that sends data to a socket. [timeout] parameter + * forces the computation to return an error if + * nothing has been written for more than [timeout] + * seconds. Default: wait forever. *) + val write : ?timeout:float -> priority:'a -> ('a,'b) handler -> + Bytes.t -> (unit,'b) t + + (** [write_bigarray ?timeout ~priority h ba] creates a computation + * that writes data from [ba] to [h.socket]. This function + * can to create a computation that writes data to a socket. *) + val write_bigarray : ?timeout:float -> priority:'a -> ('a,'b) handler -> + Io.bigarray -> (unit,'b) t + end + + module MakeIo : functor (Io:Io_t) -> Monad_io_t with type socket = Io.socket and module Io = Io + + module Io : Monad_io_t with type socket = Unix.file_descr and module Io = Io +end + + (** {2 Some culture..} + * {e Duppy is a Caribbean patois word of West African origin meaning ghost or spirit. + * Much of Caribbean folklore revolves around duppies. + * Duppies are generally regarded as malevolent spirits. + * They are said to come out and haunt people at night mostly, + * and people from the islands claim to have seen them. + * The 'Rolling Calf', 'Three footed horse' or 'Old Higue' are examples of the more malicious spirits. } + * {R {{:http://en.wikipedia.org/wiki/Duppy} http://en.wikipedia.org/wiki/Duppy}}*) diff --git a/src/duppy_secure_transport.ml b/src/duppy_secure_transport.ml new file mode 100644 index 0000000..273d30c --- /dev/null +++ b/src/duppy_secure_transport.ml @@ -0,0 +1,19 @@ +type secure_transport_socket = { + ctx: SecureTransport.t; + sock: Unix.file_descr +} +module Ssl_transport : Duppy.Transport_t with type t = secure_transport_socket = +struct + type t = secure_transport_socket + type bigarray = (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t + let sock {sock} = sock + let read {ctx} buf ofs len = + SecureTransport.read ctx buf ofs len + let write {ctx} buf ofs len = + SecureTransport.write ctx buf ofs len + let ba_write _ _ _ _ = + failwith "Not implemented!" +end + +module Io = Duppy.MakeIo(Ssl_transport) +module Monad_io = Duppy.Monad.MakeIo(Io) diff --git a/src/duppy_secure_transport.mli b/src/duppy_secure_transport.mli new file mode 100644 index 0000000..e176117 --- /dev/null +++ b/src/duppy_secure_transport.mli @@ -0,0 +1,6 @@ +type secure_transport_socket = { + ctx: SecureTransport.t; + sock: Unix.file_descr +} +module Io : Duppy.Io_t with type socket = secure_transport_socket +module Monad_io : Duppy.Monad.Monad_io_t with type socket = secure_transport_socket diff --git a/src/duppy_ssl.ml b/src/duppy_ssl.ml new file mode 100644 index 0000000..d087677 --- /dev/null +++ b/src/duppy_ssl.ml @@ -0,0 +1,13 @@ +module Ssl_transport : Duppy.Transport_t with type t = Ssl.socket = +struct + type t = Ssl.socket + type bigarray = (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t + let sock = Ssl.file_descr_of_socket + let read = Ssl.read + let write = Ssl.write + let ba_write _ _ _ _ = + failwith "Not implemented!" +end + +module Io = Duppy.MakeIo(Ssl_transport) +module Monad_io = Duppy.Monad.MakeIo(Io) diff --git a/src/duppy_ssl.mli b/src/duppy_ssl.mli new file mode 100644 index 0000000..b417a0e --- /dev/null +++ b/src/duppy_ssl.mli @@ -0,0 +1,2 @@ +module Io : Duppy.Io_t with type socket = Ssl.socket +module Monad_io : Duppy.Monad.Monad_io_t with type socket = Ssl.socket diff --git a/src/duppy_stubs.c b/src/duppy_stubs.c new file mode 100644 index 0000000..ac70284 --- /dev/null +++ b/src/duppy_stubs.c @@ -0,0 +1,176 @@ +/* + * Copyright 2010 Savonet team + * + * This file is part of Ocaml-duppy. + * + * Ocaml-duppy 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. + * + * Ocaml-duppy 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 Ocaml-duppy; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#include + +/* On native Windows platforms, many macros are not defined. */ +# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + +#ifndef EWOULDBLOCK +#define EWOULDBLOCK EAGAIN +#endif + +#endif + +#ifdef WIN32 +#define Fd_val(fd) win_CRT_fd_of_filedescr(fd) +#define Val_fd(fd) caml_failwith("Val_fd") +#else +#define Fd_val(fd) Int_val(fd) +#define Val_fd(fd) Val_int(fd) +#endif + +#ifndef WIN32 +#include + +CAMLprim value caml_poll(value _read, value _write, value _err, value _timeout) { + CAMLparam3(_read, _write, _err); + CAMLlocal4(_pread, _pwrite, _perr, _ret); + + struct pollfd *fds; + nfds_t nfds = 0; + nfds_t nread = 0; + nfds_t nwrite = 0; + nfds_t nerr = 0; + int timeout; + size_t last = 0; + int n, ret; + + if (Double_val(_timeout) == -1) + timeout = -1; + else + timeout = Double_val(_timeout) * 1000; + + nfds += Wosize_val(_read); + nfds += Wosize_val(_write); + nfds += Wosize_val(_err); + + fds = calloc(nfds,sizeof(struct pollfd)); + if (fds == NULL) caml_raise_out_of_memory(); + + for (n = 0; n < Wosize_val(_read); n++) { + fds[last+n].fd = Fd_val(Field(_read,n)); + fds[last+n].events = POLLIN; + } + last += Wosize_val(_read); + + for (n = 0; n < Wosize_val(_write); n++) { + fds[last+n].fd = Fd_val(Field(_write,n)); + fds[last+n].events = POLLOUT; + } + last += Wosize_val(_write); + + for (n = 0; n < Wosize_val(_err); n++) { + fds[last+n].fd = Fd_val(Field(_err,n)); + fds[last+n].events = POLLERR; + } + + caml_release_runtime_system(); + ret = poll(fds, nfds, timeout); + caml_acquire_runtime_system(); + + if (ret == -1) { + free(fds); + uerror("poll",Nothing); + } + + for (n = 0; n < nfds; n++) { + if (fds[n].revents & POLLIN) + nread++; + if (fds[n].revents & POLLOUT) + nwrite++; + if (fds[n].revents & POLLERR) + nerr++; + } + + _pread = caml_alloc_tuple(nread); + nread = 0; + + _pwrite = caml_alloc_tuple(nwrite); + nwrite = 0; + + _perr = caml_alloc_tuple(nerr); + nerr = 0; + + for (n = 0; n < nfds; n++) { + if (fds[n].revents & POLLIN) { + Store_field(_pread, nread, Val_fd(fds[n].fd)); + nread++; + } + if (fds[n].revents & POLLOUT) { + Store_field(_pwrite, nwrite, Val_fd(fds[n].fd)); + nwrite++; + } + if (fds[n].revents & POLLERR) { + Store_field(_pread, nerr, Val_fd(fds[n].fd)); + nerr++; + } + } + + free(fds); + + _ret = caml_alloc_tuple(3); + Store_field(_ret, 0, _pread); + Store_field(_ret, 1, _pwrite); + Store_field(_ret, 2, _perr); + + CAMLreturn(_ret); +} +#else +CAMLprim value caml_poll(value _read, value _write, value _err, value _timeout) { + caml_failwith("caml_poll"); +} +#endif + +CAMLprim value ocaml_duppy_write_ba(value _fd, value ba, value _ofs, value _len) +{ + CAMLparam2(ba,_fd) ; + int fd = Fd_val(_fd); + long ofs = Long_val(_ofs); + long len = Long_val(_len); + void *buf = Caml_ba_data_val(ba); + int ret; + + int written = 0; + while (len > 0) { + caml_enter_blocking_section(); + ret = write(fd, buf+ofs, len); + caml_leave_blocking_section(); + if (ret == -1) { + if ((errno == EAGAIN || errno == EWOULDBLOCK) && written > 0) break; + uerror("write", Nothing); + } + written += ret; + ofs += ret; + len -= ret; + } + + CAMLreturn(Val_long(written)); +} + -- cgit v1.2.3 From 72db6d910338499b96f773e0498d4f9fe32607e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?St=C3=A9phane=20Glondu?= Date: Sun, 28 Nov 2021 17:37:56 +0100 Subject: Import ocaml-duppy_0.9.2.orig.tar.gz [dgit import orig ocaml-duppy_0.9.2.orig.tar.gz] --- .github/workflows/ci.yml | 24 ++ .gitignore | 7 + .merlin | 4 + .ocamlformat | 9 + .travis-ci.sh | 15 + CHANGES | 133 ++++++ COPYING | 504 ++++++++++++++++++++++ README.md | 48 +++ dune-project | 17 + duppy.opam | 29 ++ examples/dune | 9 + examples/http.ml | 555 ++++++++++++++++++++++++ examples/index.html | 1 + examples/telnet.ml | 151 +++++++ src/dune | 8 + src/duppy.ml | 1077 ++++++++++++++++++++++++++++++++++++++++++++++ src/duppy.mli | 549 +++++++++++++++++++++++ src/duppy_stubs.c | 176 ++++++++ 18 files changed, 3316 insertions(+) create mode 100644 .github/workflows/ci.yml create mode 100644 .gitignore create mode 100644 .merlin create mode 100644 .ocamlformat create mode 100755 .travis-ci.sh create mode 100644 CHANGES create mode 100644 COPYING create mode 100644 README.md create mode 100644 dune-project create mode 100644 duppy.opam create mode 100644 examples/dune create mode 100644 examples/http.ml create mode 100644 examples/index.html create mode 100644 examples/telnet.ml create mode 100644 src/dune create mode 100644 src/duppy.ml create mode 100644 src/duppy.mli create mode 100644 src/duppy_stubs.c diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..5f6a8f0 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,24 @@ +name: CI + +on: [push] + +jobs: + build: + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, macos-latest] + steps: + - uses: actions/checkout@v1 + - name: Setup OCaml + uses: avsm/setup-ocaml@master + - name: Install depext module + run: opam install -y depext + - name: Pin locally + run: opam pin -y add --no-action . + - name: Install locally + run: opam depext -y -i duppy + - name: Build locally + run: eval $(opam env) && dune build + - name: Run tests locally + run: eval $(opam env) && dune runtest diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..6fadc6f --- /dev/null +++ b/.gitignore @@ -0,0 +1,7 @@ +*~ +_build +*.byte +*.native +_tests +.merlin +*.install diff --git a/.merlin b/.merlin new file mode 100644 index 0000000..6db9a00 --- /dev/null +++ b/.merlin @@ -0,0 +1,4 @@ +B src/** +S src/** +B +threads +PKG pcre diff --git a/.ocamlformat b/.ocamlformat new file mode 100644 index 0000000..533d804 --- /dev/null +++ b/.ocamlformat @@ -0,0 +1,9 @@ +profile = conventional +break-separators = after +space-around-lists = false +doc-comments = before +match-indent = 2 +match-indent-nested = always +parens-ite +exp-grouping = preserve +module-item-spacing = compact diff --git a/.travis-ci.sh b/.travis-ci.sh new file mode 100755 index 0000000..82e886d --- /dev/null +++ b/.travis-ci.sh @@ -0,0 +1,15 @@ +# Hacking the build into Travis-CI "C" environment +# See http://anil.recoil.org/2013/09/30/travis-and-ocaml.html + +export OPAMYES=1 +opam init +if [ -n "${OPAM_SWITCH}" ]; then + opam switch ${OPAM_SWITCH} +fi +eval `opam config env` +opam install -y depext dune +opam pin -y add --no-action . +opam depext -y -i duppy + +# compile +dune build diff --git a/CHANGES b/CHANGES new file mode 100644 index 0000000..dbfbb62 --- /dev/null +++ b/CHANGES @@ -0,0 +1,133 @@ +0.9.2 (07-10-2021) +===== +* Fix deadlock issue at shutdown. + +0.9.1 (06-21-2021) +===== +* Make `stop` synchronous, waiting for all tasks to stop + while sending `Condition.signal`. Should avoid potential + race-conditions when signaling tasks to end. + +0.9.0 (07-10-2020) +===== +* Add offset/length to writing functions. +* Convert to dune. +* Drop unused SSL and SecureTransport optional libs. + +0.8.0 (12-11-2018) +===== +* Removed camlp4 syntactic sugar (unmaintained, unused in liquidsoap now). + +0.7.4 (10-11-2018) +===== +* Fix stack overflow by making recursive function fully tail-rec. (ref savonet/liquidsoap#640) + +0.7.3 (12-09-2018) +===== +* Fix write/select logic on windows systems. (savonet/liquidsoap#610) +* Avoid race conditions when shutting down. + +0.7.2 (28-08-2018) +===== +* Add placeholder implementation for `caml_poll` on Win32. + +0.7.1 (18-08-2018) +===== +* Use poll() when available. +* Wake up all queues when shutting down. + +0.7.0 (03-11-2017) +===== +* Fix bytes compatibility with OCaml 4.06 and above. +* Fix camlp4 availability test. + +0.6.1 (23-08-2017) +===== +* Added SecureTransport support. + +0.6.0 (11-04-2017) +===== +* Added SSL support. + +0.5.2 (03-08-2015) +===== +* Dummy github release. + +0.5.1 (05-08-2013) +===== +* Removed win32 select work-around: patch applied upstream. + +0.5.0 (04-03-2013) +===== +* Remove Panic exception and let original exception bubble through. + +0.4.2 (08-10-2011) +===== +* Reimplemented monadic Mutex and Condition. +* Consume more than one char when waking up Async tasks. + +0.4.1 (04-08-2011) +===== +* Added optional timeout for + all [Duppy.Io] and [Duppy.Monad.Io] + operations. +* Fixed handling of EINTR: update the + timeout when restarting after being + interrupted. + +0.4.0 (26-06-2011) +===== +* Added a monad API to write + server code. +* Close both sides of the pipe + in Duppy.Async +* Make calls to [stop] and [wake_up] + thread-safe in Duppy.Async +* Catch Unix.EINTR when calling Unix.select. + +0.3.2 (19-08-2010) +===== +* Switch from Thread.select to + Unix.select. They are the same on + POSIX and only Unix.select is available + on Win32.. +* Do not use assertions on Mutex.try_lock + on Win32: on this plateform, a thread can + double-lock a mutex, making the assertion + inconsistent. + +0.3.1 (14-10-2009) +===== +* Really catch raised exception on Duppy.Io + operations: catching was missing on recurrent + calls. + +0.3.0 (18-06-2009) +===== +* Added support for --enable-debugging configure option +* Fixed Makefile for BSD: call $(MAKE) for generating documentation. +* Added the possibility to restart the task after the returned positive + delay in Async. +* Added unknown exceptions on Duppy.Io when calling on_error. + +0.2.0 (17-02-2009) +===== +* Fixed typo in Duppy.Async: exception is now Stopped. + +0.1.2 (01-07-2008) +===== +* Changed logic in shutdown for Async interface: + now [Duppy.Async.shutdown t] also wakes the task if + asleep. Still it can't stop a running task. +* Fixed race conditions when a queue starts the select loop: + a task could be submitted, but no queue would wake up. + +0.1.1 (15-04-2008) +===== +* Fixed Conditions usage for non-unix systems +* Fixed typos in the documentation, added some details +* Installs .cmx file + +0.1.0 (07-03-2008) +===== +* Initial release diff --git a/COPYING b/COPYING new file mode 100644 index 0000000..b1e3f5a --- /dev/null +++ b/COPYING @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + + diff --git a/README.md b/README.md new file mode 100644 index 0000000..d621f21 --- /dev/null +++ b/README.md @@ -0,0 +1,48 @@ +# ocaml-duppy + +ocaml-duppy is an advanced scheduler for Ocaml programmers. + +Please read the COPYING file before using this software. + +## Prerequisites: + +- ocaml >= 4.03.0 + +- findlib >= 1.8.0 + +- ocaml-pcre >= 7.3.4 + +- dune >= 2.0 + +The code may work with earlier versions but these are the one currently +supported. + +## Compilation: + +```sh +$ dune build +``` + +This should build both the native and the byte-code version of the +extension library. + +## Installation: + +Via `opam`: + +```sh +$ opam install duppy +``` + +Via `dune` (for developers): +```sh +$ dune install +``` + +This should install the library file (using ocamlfind) in the +appropriate place. + +## Author: + +This author of this software may be contacted by electronic mail +at the following address: savonet-users@lists.sourceforge.net. diff --git a/dune-project b/dune-project new file mode 100644 index 0000000..6c50961 --- /dev/null +++ b/dune-project @@ -0,0 +1,17 @@ +(lang dune 2.7) +(version 0.9.2) +(name duppy) +(source (github savonet/ocaml-duppy)) +(license GPL-2.0) +(authors "Romain Beauxis ") +(maintainers "The Savonet Team ") + +(generate_opam_files true) + +(package + (name duppy) + (synopsis "Library providing monadic threads") + (depends + dune + pcre) +) diff --git a/duppy.opam b/duppy.opam new file mode 100644 index 0000000..0095389 --- /dev/null +++ b/duppy.opam @@ -0,0 +1,29 @@ +# This file is generated by dune, edit dune-project instead +opam-version: "2.0" +version: "0.9.2" +synopsis: "Library providing monadic threads" +maintainer: ["The Savonet Team "] +authors: ["Romain Beauxis "] +license: "GPL-2.0" +homepage: "https://github.com/savonet/ocaml-duppy" +bug-reports: "https://github.com/savonet/ocaml-duppy/issues" +depends: [ + "dune" {>= "2.7"} + "pcre" + "odoc" {with-doc} +] +build: [ + ["dune" "subst"] {dev} + [ + "dune" + "build" + "-p" + name + "-j" + jobs + "@install" + "@runtest" {with-test} + "@doc" {with-doc} + ] +] +dev-repo: "git+https://github.com/savonet/ocaml-duppy.git" diff --git a/examples/dune b/examples/dune new file mode 100644 index 0000000..887559f --- /dev/null +++ b/examples/dune @@ -0,0 +1,9 @@ +(executable + (name http) + (modules http) + (libraries duppy)) + +(executable + (name telnet) + (modules telnet) + (libraries duppy)) diff --git a/examples/http.ml b/examples/http.ml new file mode 100644 index 0000000..d6e65ce --- /dev/null +++ b/examples/http.ml @@ -0,0 +1,555 @@ +let non_blocking_queues = ref 3 +let maybe_blocking_queues = ref 1 +let files_path = ref "" +let port = ref 8080 +let usage = "usage: http [options] /path/to/files" + +let () = + let pnum = ref 0 in + let arg s = + incr pnum; + if !pnum > 1 then ( + Printf.eprintf "Error: too many arguments\n"; + exit 1 ) + else files_path := s + in + Arg.parse + [ + ( "--non_blocking_queues", + Arg.Int (fun i -> non_blocking_queues := i), + Printf.sprintf "Number of non-blocking queues. (default: %d)" + !non_blocking_queues ); + ( "--maybe_blocking_queues", + Arg.Int (fun i -> maybe_blocking_queues := i), + Printf.sprintf "Number of maybe-blocking queues. (default: %d)" + !maybe_blocking_queues ); + ( "--port", + Arg.Int (fun i -> port := i), + Printf.sprintf "Port used to bind the server. (default: %d)" !port ); + ] + arg usage; + if !files_path = "" then ( + Printf.printf "%s\n" usage; + exit 1 ) + else () + +type priority = Maybe_blocking | Non_blocking + +let scheduler = Duppy.create () + +type http_method = Post | Get +type http_protocol = Http_11 | Http_10 + +let string_of_protocol = function + | Http_11 -> "HTTP/1.1" + | Http_10 -> "HTTP/1.0" + +let protocol_of_string = function + | "HTTP/1.1" -> Http_11 + | "HTTP/1.0" -> Http_10 + | _ -> assert false + +let string_of_method = function Post -> "POST" | Get -> "GET" + +let method_of_string = function + | "POST" -> Post + | "GET" -> Get + | _ -> assert false + +type data = None | String of string | File of Unix.file_descr + +type request = { + request_protocol : http_protocol; + request_method : http_method; + request_uri : string; + request_headers : (string * string) list; + request_data : data; +} + +type reply = { + reply_protocol : http_protocol; + reply_status : int * string; + reply_headers : (string * string) list; + reply_data : data; +} + +exception Assoc of string + +let assoc_uppercase x y = + try + List.iter + (fun (l, v) -> + if String.uppercase_ascii l = x then raise (Assoc v) else ()) + y; + raise Not_found + with Assoc s -> s + +let server = "dhttpd" + +let html_template = + Printf.sprintf + "\r\n\ + \r\n\ + %s" + +let server_error status protocol = + let _, explanation = status in + let data = + String + (html_template + (Printf.sprintf "%s\r\n%s !" + explanation explanation)) + in + { + reply_protocol = protocol; + reply_status = status; + reply_headers = + [("Content-Type", "text/html; charset=UTF-8"); ("Server", server)]; + reply_data = data; + } + +let error_404 = server_error (404, "File Not Found") +let error_500 = server_error (500, "Bad Request") Http_10 +let error_403 = server_error (403, "Forbidden") + +let http_302 protocol uri = + { + reply_protocol = protocol; + reply_status = (302, "Found"); + reply_headers = [("Location", uri)]; + reply_data = String ""; + } + +type socket_status = Keep | Close + +let send_reply h reply = + let write s = + Duppy.Monad.Io.write ?timeout:None ~priority:Non_blocking h + (Bytes.unsafe_of_string s) + in + let code, status = reply.reply_status in + let http_header = + Printf.sprintf "%s %d %s\r\n%s\r\n\r\n" + (string_of_protocol reply.reply_protocol) + code status + (String.concat "\r\n" + (List.map + (fun (x, y) -> Printf.sprintf "%s: %s" x y) + reply.reply_headers)) + in + Duppy.Monad.bind (write http_header) (fun () -> + match reply.reply_data with + | String s -> write s + | File fd -> + let stats = Unix.fstat fd in + let ba = + Unix.map_file fd Bigarray.char Bigarray.c_layout false + [| stats.Unix.st_size |] + in + let ba = Bigarray.array1_of_genarray ba in + let close () = try Unix.close fd with _ -> () in + let on_error e = + close (); + h.Duppy.Monad.Io.on_error e + in + let h = { h with Duppy.Monad.Io.on_error } in + Duppy.Monad.bind + (Duppy.Monad.Io.write_bigarray ?timeout:None + ~priority:Non_blocking h ba) (fun () -> + Duppy.Monad.return (close ())) + | None -> Duppy.Monad.return ()) + +let parse_headers headers = + let split_header l h = + try + let rex = Pcre.regexp "([^:\\r\\n]+):\\s*([^\\r\\n]+)" in + let sub = Pcre.exec ~rex h in + Duppy.Monad.return + ((Pcre.get_substring sub 1, Pcre.get_substring sub 2) :: l) + with Not_found -> Duppy.Monad.raise error_500 + in + Duppy.Monad.fold_left split_header [] headers + +let index_uri path index protocol uri = + let uri = + try + let ret = Pcre.extract ~rex:(Pcre.regexp "([^\\?]*)\\?") uri in + ret.(1) + with Not_found -> uri + in + try + if Sys.is_directory (Printf.sprintf "%s%s" path uri) then + if uri.[String.length uri - 1] <> '/' then + Duppy.Monad.raise (http_302 protocol (Printf.sprintf "%s/" uri)) + else ( + let index = Printf.sprintf "%s/%s" uri index in + if Sys.file_exists (Printf.sprintf "%s/%s" path index) then + Duppy.Monad.return index + else Duppy.Monad.return uri ) + else Duppy.Monad.return uri + with _ -> Duppy.Monad.return uri + +let file_request path _ request = + let uri = + try + let ret = + Pcre.extract ~rex:(Pcre.regexp "([^\\?]*)\\?.*") request.request_uri + in + ret.(1) + with Not_found -> request.request_uri + in + let __pa_duppy_0 = index_uri path "index.html" request.request_protocol uri in + Duppy.Monad.bind __pa_duppy_0 (fun uri -> + let fname = Printf.sprintf "%s%s" path uri in + if Sys.file_exists fname then ( + try + let fd = Unix.openfile fname [Unix.O_RDONLY] 0o640 in + let stats = Unix.fstat fd in + let headers = + [ + ("Server", server); + ("Content-Length", string_of_int stats.Unix.st_size); + ] + in + let headers = + if Pcre.pmatch ~rex:(Pcre.regexp "\\.html$") fname then + ("Content-Type", "text/html") :: headers + else if Pcre.pmatch ~rex:(Pcre.regexp "\\.css$") fname then + ("Content-Type", "text/css") :: headers + else headers + in + Duppy.Monad.raise + { + reply_protocol = request.request_protocol; + reply_status = (200, "OK"); + reply_headers = headers; + reply_data = File fd; + } + with _ -> Duppy.Monad.raise (error_403 request.request_protocol) ) + else Duppy.Monad.raise (error_404 request.request_protocol)) + +let file_handler = ((fun _ -> Duppy.Monad.return true), file_request !files_path) + +let cgi_handler process path h request = + let uri, args, suffix = + try + let ret = + Pcre.extract ~rex:(Pcre.regexp "([^\\?]*)\\?(.*)") request.request_uri + in + try + let ans = + Pcre.extract ~rex:(Pcre.regexp "^([^/]*)/([^&=]*)$") ret.(2) + in + (ret.(1), ans.(1), ans.(2)) + with Not_found -> (ret.(1), ret.(2), "") + with Not_found -> (request.request_uri, "", "") + in + let __pa_duppy_0 = index_uri path "index.php" request.request_protocol uri in + Duppy.Monad.bind __pa_duppy_0 (fun script -> + let script = Printf.sprintf "%s%s" path script in + let env = + Printf.sprintf + "export SERVER_SOFTWARE=Duppy-httpd/1.0; export \ + SERVER_NAME=localhost; export GATEWAY_INTERFACE=CGI/1.1; export \ + SERVER_PROTOCOL=%s; export SERVER_PORT=%d; export \ + REQUEST_METHOD=%s; export REQUEST_URI=%s; export \ + REDIRECT_STATUS=200; export SCRIPT_FILENAME=%s" + (string_of_protocol request.request_protocol) + !port + (string_of_method request.request_method) + (Filename.quote uri) (Filename.quote script) + in + let env = + Printf.sprintf "%s; export QUERY_STRING=%s" env (Filename.quote args) + in + let env = + let tr_suffix = Printf.sprintf "%s%s" path suffix in + (* Trick ! *) + let tr_suffix = + Printf.sprintf "%s/%s" + (Filename.dirname tr_suffix) + (Filename.basename tr_suffix) + in + Printf.sprintf "%s; export PATH_TRANSLATED=%s; export PATH_INFO=%s" env + (Filename.quote tr_suffix) (Filename.quote suffix) + in + let sanitize s = + Pcre.replace ~pat:"-" ~templ:"_" (String.uppercase_ascii s) + in + let headers = + List.map (fun (x, y) -> (sanitize x, y)) request.request_headers + in + let append env key = + if List.mem_assoc key headers then + Printf.sprintf "%s; export %s=%s" env key + (Filename.quote (List.assoc key headers)) + else env + in + let env = append env "CONTENT_TYPE" in + let env = append env "CONTENT_LENGTH" in + let __pa_duppy_0 = + if List.mem_assoc "AUTHORIZATION" headers then ( + let ret = + Pcre.extract + ~rex:(Pcre.regexp "(^[^\\s]*\\s.*)$") + (List.assoc "AUTHORIZATION" headers) + in + if Array.length ret > 0 then + Duppy.Monad.return + (Printf.sprintf "%s; extract AUTH_TYPE=%s" env ret.(1)) + else Duppy.Monad.raise error_500 ) + else Duppy.Monad.return env + in + Duppy.Monad.bind __pa_duppy_0 (fun env -> + let f env (x, y) = + Printf.sprintf "%s; export HTTP_%s=%s" env x (Filename.quote y) + in + let env = List.fold_left f env headers in + let data = + match request.request_data with + | None -> "" + | String s -> s + | _ -> assert false + in + (* not implemented *) + let process = Printf.sprintf "%s; %s 2>/dev/null" env process in + let in_c, out_c = Unix.open_process process in + let out_s = Unix.descr_of_out_channel out_c in + let h = { h with Duppy.Monad.Io.socket = out_s; data = "" } in + let __pa_duppy_0 = + Duppy.Monad.Io.write ?timeout:None ~priority:Non_blocking h + (Bytes.unsafe_of_string data) + in + Duppy.Monad.bind __pa_duppy_0 (fun () -> + let in_s = Unix.descr_of_in_channel in_c in + let h = { h with Duppy.Monad.Io.socket = in_s; data = "" } in + let __pa_duppy_0 = + Duppy.Monad.Io.read ?timeout:None ~priority:Non_blocking + ~marker:(Duppy.Io.Split "[\r]?\n[\r]?\n") h + in + Duppy.Monad.bind __pa_duppy_0 (fun headers -> + let __pa_duppy_0 = + Duppy.Monad.catch + (Duppy.Monad.Io.read_all ?timeout:None + ~priority:Non_blocking h.Duppy.Monad.Io.scheduler in_s) + (fun (s, _) -> Duppy.Monad.return s) + in + Duppy.Monad.bind __pa_duppy_0 (fun data -> + let data = + Printf.sprintf "%s%s" h.Duppy.Monad.Io.data data + in + ignore (Unix.close_process (in_c, out_c)); + let __pa_duppy_0 = + let headers = Pcre.split ~pat:"\r\n" headers in + parse_headers headers + in + Duppy.Monad.bind __pa_duppy_0 (fun headers -> + let __pa_duppy_0 = + if List.mem_assoc "Status" headers then ( + try + let ans = + Pcre.extract + ~rex:(Pcre.regexp "([\\d]+)\\s(.*)") + (List.assoc "Status" headers) + in + Duppy.Monad.return + ( (int_of_string ans.(1), ans.(2)), + List.filter + (fun (x, _) -> x <> "Status") + headers ) + with _ -> Duppy.Monad.raise error_500 ) + else Duppy.Monad.return ((200, "OK"), headers) + in + Duppy.Monad.bind __pa_duppy_0 + (fun (status, headers) -> + let headers = + ( "Content-length", + string_of_int (String.length data) ) + :: headers + in + Duppy.Monad.raise + { + reply_protocol = request.request_protocol; + reply_status = status; + reply_headers = headers; + reply_data = String data; + }))))))) + +let php_handler = + ( (fun request -> + let __pa_duppy_0 = + index_uri !files_path "index.php" request.request_protocol + request.request_uri + in + Duppy.Monad.bind __pa_duppy_0 (fun uri -> + Duppy.Monad.return (Pcre.pmatch ~rex:(Pcre.regexp "\\.php$") uri))), + cgi_handler "php-cgi" !files_path ) + +let handlers = [php_handler; file_handler] + +let handle_request h request = + let f (check, handler) = + let __pa_duppy_0 = check request in + Duppy.Monad.bind __pa_duppy_0 (fun check -> + if check then handler h request else Duppy.Monad.return ()) + in + Duppy.Monad.catch + (Duppy.Monad.bind (Duppy.Monad.iter f handlers) (fun () -> + Duppy.Monad.return (error_404 request.request_protocol))) + (fun reply -> Duppy.Monad.return reply) + +let parse_request h r = + try + let headers = Pcre.split ~pat:"\r\n" r in + let __pa_duppy_0 = + match headers with + | e :: l -> + let __pa_duppy_0 = parse_headers l in + Duppy.Monad.bind __pa_duppy_0 (fun headers -> + Duppy.Monad.return (e, headers)) + | _ -> Duppy.Monad.raise error_500 + in + Duppy.Monad.bind __pa_duppy_0 (fun (request, headers) -> + let rex = Pcre.regexp "([\\w]+)\\s([^\\s]+)\\s(HTTP/1.[01])" in + let __pa_duppy_0 = + try + let sub = Pcre.exec ~rex request in + let http_method, uri, protocol = + ( Pcre.get_substring sub 1, + Pcre.get_substring sub 2, + Pcre.get_substring sub 3 ) + in + Duppy.Monad.return + (method_of_string http_method, uri, protocol_of_string protocol) + with _ -> Duppy.Monad.raise error_500 + in + Duppy.Monad.bind __pa_duppy_0 (fun (http_method, uri, protocol) -> + let __pa_duppy_0 = + match http_method with + | Get -> Duppy.Monad.return None + | Post -> + let __pa_duppy_0 = + try + let length = assoc_uppercase "CONTENT-LENGTH" headers in + Duppy.Monad.return (int_of_string length) + with + | Not_found -> Duppy.Monad.return 0 + | _ -> Duppy.Monad.raise error_500 + in + Duppy.Monad.bind __pa_duppy_0 (fun len -> + match len with + | 0 -> Duppy.Monad.return None + | d -> + let __pa_duppy_0 = + Duppy.Monad.Io.read ?timeout:None + ~priority:Non_blocking + ~marker:(Duppy.Io.Length d) h + in + Duppy.Monad.bind __pa_duppy_0 (fun data -> + Duppy.Monad.return (String data))) + in + Duppy.Monad.bind __pa_duppy_0 (fun data -> + Duppy.Monad.return + { + request_method = http_method; + request_protocol = protocol; + request_uri = uri; + request_headers = headers; + request_data = data; + }))) + with _ -> Duppy.Monad.raise error_500 + +let handle_client socket = + (* Read and process lines *) + let on_error _ = error_500 in + let h = { Duppy.Monad.Io.scheduler; socket; data = ""; on_error } in + let rec exec () = + let __pa_duppy_0 = + Duppy.Monad.catch + (let __pa_duppy_0 = + Duppy.Monad.Io.read ?timeout:None ~priority:Non_blocking + ~marker:(Duppy.Io.Split "\r\n\r\n") h + in + Duppy.Monad.bind __pa_duppy_0 (fun data -> + let __pa_duppy_0 = parse_request h data in + Duppy.Monad.bind __pa_duppy_0 (fun request -> + let __pa_duppy_0 = handle_request h request in + Duppy.Monad.bind __pa_duppy_0 (fun reply -> + let close_header headers = + try assoc_uppercase "CONNECTION" headers = "close" + with Not_found -> false + in + let keep = + if + request.request_protocol = Http_10 + || close_header request.request_headers + || close_header reply.reply_headers + then Close + else Keep + in + Duppy.Monad.return (keep, reply))))) + (fun reply -> Duppy.Monad.return (Close, reply)) + in + Duppy.Monad.bind __pa_duppy_0 (fun (keep, reply) -> + Duppy.Monad.bind (send_reply h reply) (fun () -> + if keep = Keep then exec () else Duppy.Monad.return ())) + in + let finish _ = try Unix.close socket with _ -> () in + Duppy.Monad.run ~return:finish ~raise:finish (exec ()) + +let new_queue ~priority ~name () = + let priorities p = p = priority in + let queue () = Duppy.queue scheduler ~log:(fun _ -> ()) ~priorities name in + Thread.create queue () + +let bind_addr_inet = Unix.inet_addr_of_string "0.0.0.0" +let bind_addr = Unix.ADDR_INET (bind_addr_inet, !port) +let max_conn = 100 +let sock = Unix.socket Unix.PF_INET Unix.SOCK_STREAM 0 + +let () = + (* See http://caml.inria.fr/mantis/print_bug_page.php?bug_id=4640 + * for this: we want Unix EPIPE error and not SIGPIPE, which + * crashes the program.. *) + Sys.set_signal Sys.sigpipe Sys.Signal_ignore; + ignore (Unix.sigprocmask Unix.SIG_BLOCK [Sys.sigpipe]); + Unix.setsockopt sock Unix.SO_REUSEADDR true; + let rec incoming _ = + ( try + let s, _ = Unix.accept sock in + handle_client s + with e -> + Printf.printf "Failed to accept new client: %S\n" (Printexc.to_string e) + ); + [ + { + Duppy.Task.priority = Non_blocking; + events = [`Read sock]; + handler = incoming; + }; + ] + in + ( try Unix.bind sock bind_addr + with Unix.Unix_error (Unix.EADDRINUSE, "bind", "") -> + failwith (Printf.sprintf "port %d already taken" !port) ); + Unix.listen sock max_conn; + Duppy.Task.add scheduler + { + Duppy.Task.priority = Non_blocking; + events = [`Read sock]; + handler = incoming; + }; + for i = 1 to !non_blocking_queues do + ignore + (new_queue ~priority:Non_blocking + ~name:(Printf.sprintf "Non blocking queue #%d" i) + ()) + done; + for i = 1 to !maybe_blocking_queues do + ignore + (new_queue ~priority:Maybe_blocking + ~name:(Printf.sprintf "Maybe blocking queue #%d" i) + ()) + done; + Duppy.queue scheduler ~log:(fun _ -> ()) "root" diff --git a/examples/index.html b/examples/index.html new file mode 100644 index 0000000..a7f8d9e --- /dev/null +++ b/examples/index.html @@ -0,0 +1 @@ +bla diff --git a/examples/telnet.ml b/examples/telnet.ml new file mode 100644 index 0000000..1511e33 --- /dev/null +++ b/examples/telnet.ml @@ -0,0 +1,151 @@ +type priority = Non_blocking | Maybe_blocking + +let io_priority = Non_blocking + +(* Create scheduler *) +let scheduler = Duppy.create () + +(* Create two queues, + * one for non blocking events + * and another for blocking + * events *) +let new_queue ~priority ~name () = + let log = Printf.printf "%s: %s\n%!" name in + let priorities p = p = priority in + let queue () = Duppy.queue scheduler ~log ~priorities name in + Thread.create queue () + +let th = + ignore (new_queue ~priority:Non_blocking ~name:"Non blocking queue" ()); + ignore (new_queue ~priority:Maybe_blocking ~name:"Maybe blocking queue #1" ()); + new_queue ~priority:Maybe_blocking ~name:"Maybe blocking queue #2" () + +let exec_command s () = + let chan = Unix.open_process_in s in + let rec aux () = + match try Some (input_line chan) with End_of_file -> None with + | None -> [] + | Some s -> s :: aux () + in + let l = aux () in + ignore (Unix.close_process_in chan); + Duppy.Monad.return (String.concat "\r\n" l) + +let commands = Hashtbl.create 10 + +let () = + Hashtbl.add commands "hello" (false, fun () -> Duppy.Monad.return "world"); + Hashtbl.add commands "foo" (false, fun () -> Duppy.Monad.return "bar"); + Hashtbl.add commands "uptime" (true, exec_command "uptime"); + Hashtbl.add commands "date" (true, exec_command "date"); + Hashtbl.add commands "whoami" (true, exec_command "whoami"); + Hashtbl.add commands "sleep" (true, exec_command "sleep 15"); + Hashtbl.add commands "exit" (true, fun () -> Duppy.Monad.raise ()) + +(* Add commands here *) +let help = Buffer.create 10 + +let () = + Buffer.add_string help "List of commands:"; + Hashtbl.iter + (fun x _ -> Buffer.add_string help (Printf.sprintf "\r\n%s" x)) + commands; + Hashtbl.add commands "help" + (false, fun () -> Duppy.Monad.return (Buffer.contents help)) + +let handle_client socket = + let on_error e = + match e with + | Duppy.Io.Io_error -> Printf.printf "Client disconnected" + | Duppy.Io.Unix (c, p, m) -> + Printf.printf "%s" (Printexc.to_string (Unix.Unix_error (c, p, m))) + | Duppy.Io.Unknown e -> Printf.printf "%s" (Printexc.to_string e) + | Duppy.Io.Timeout -> Printf.printf "Timeout" + in + let h = { Duppy.Monad.Io.scheduler; socket; data = ""; on_error } in + (* Read and process lines *) + let rec exec () = + let __pa_duppy_0 = + Duppy.Monad.Io.read ?timeout:None ~priority:io_priority + ~marker:(Duppy.Io.Split "[\r\n]+") h + in + Duppy.Monad.bind __pa_duppy_0 (fun req -> + let __pa_duppy_0 = + try + let blocking, command = Hashtbl.find commands req in + if not blocking then command () + else Duppy.Monad.Io.exec ~priority:Maybe_blocking h (command ()) + with Not_found -> + Duppy.Monad.return + "ERROR: unknown command, type \"help\" to get a list of commands." + in + Duppy.Monad.bind __pa_duppy_0 (fun ans -> + Duppy.Monad.bind + (Duppy.Monad.bind + (Duppy.Monad.Io.write ?timeout:None ~priority:io_priority h + (Bytes.unsafe_of_string "BEGIN\r\n")) + (fun () -> + Duppy.Monad.bind + (Duppy.Monad.Io.write ?timeout:None ~priority:io_priority h + (Bytes.unsafe_of_string ans)) + (fun () -> + Duppy.Monad.Io.write ?timeout:None ~priority:io_priority + h + (Bytes.unsafe_of_string "\r\nEND\r\n")))) + (fun () -> exec ()))) + in + let close () = try Unix.close socket with _ -> () in + let return () = + let on_error e = + on_error e; + close () + in + Duppy.Io.write ~priority:io_priority ~on_error ~exec:close scheduler + ~string:(Bytes.unsafe_of_string "Bye!\r\n") + socket + in + Duppy.Monad.run ~return ~raise:close (exec ()) + +open Unix + +let port = 4123 +let bind_addr_inet = inet_addr_of_string "0.0.0.0" +let bind_addr = ADDR_INET (bind_addr_inet, port) +let max_conn = 10 +let sock = socket PF_INET SOCK_STREAM 0 + +let () = + setsockopt sock SO_REUSEADDR true; + let rec incoming _ = + ( try + let s, caller = accept sock in + let ip = + let a = + match caller with ADDR_INET (a, _) -> a | _ -> assert false + in + try (gethostbyaddr a).h_name with Not_found -> string_of_inet_addr a + in + Printf.printf "New client: %s\n" ip; + handle_client s + with e -> + Printf.printf "Failed to accept new client: %S\n" (Printexc.to_string e) + ); + [ + { + Duppy.Task.priority = io_priority; + Duppy.Task.events = [`Read sock]; + Duppy.Task.handler = incoming; + }; + ] + in + ( try bind sock bind_addr + with Unix.Unix_error (Unix.EADDRINUSE, "bind", "") -> + failwith (Printf.sprintf "port %d already taken" port) ); + listen sock max_conn; + Duppy.Task.add scheduler + { + Duppy.Task.priority = io_priority; + Duppy.Task.events = [`Read sock]; + Duppy.Task.handler = incoming; + }; + Thread.join th diff --git a/src/dune b/src/dune new file mode 100644 index 0000000..0f40400 --- /dev/null +++ b/src/dune @@ -0,0 +1,8 @@ +(library + (name duppy) + (public_name duppy) + (libraries unix threads pcre bigarray) + (foreign_stubs + (language c) + (names duppy_stubs)) + (synopsis "OCaml advanced scheduler")) diff --git a/src/duppy.ml b/src/duppy.ml new file mode 100644 index 0000000..cb0d6e6 --- /dev/null +++ b/src/duppy.ml @@ -0,0 +1,1077 @@ +(***************************************************************************** + + Duppy, a task scheduler for OCaml. + Copyright 2003-2010 Savonet team + + 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 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, fully stated in the COPYING + file at the root of the liquidsoap distribution. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + *****************************************************************************) + +type fd = Unix.file_descr + +external poll : + Unix.file_descr array -> + Unix.file_descr array -> + Unix.file_descr array -> + float -> + Unix.file_descr array * Unix.file_descr array * Unix.file_descr array + = "caml_poll" + +let poll r w e timeout = + let r = Array.of_list r in + let w = Array.of_list w in + let e = Array.of_list e in + let r, w, e = poll r w e timeout in + (Array.to_list r, Array.to_list w, Array.to_list e) + +let select, select_fname = + match Sys.os_type with + | "Unix" -> (poll, "poll") + | _ -> (Unix.select, "select") + +(** [remove f l] is like [List.find f l] but also returns the result of removing + * the found element from the original list. *) +let remove f l = + let rec aux acc = function + | [] -> raise Not_found + | x :: l -> if f x then (x, List.rev_append acc l) else aux (x :: acc) l + in + aux [] l + +(** Events and tasks from the implementation point-of-view: + * we have to hide the 'a parameter. *) + +type e = { r : fd list; w : fd list; x : fd list; t : float } + +type 'a t = { + timestamp : float; + prio : 'a; + enrich : e -> e; + is_ready : e -> (unit -> 'a t list) option; +} + +type 'a scheduler = { + out_pipe : Unix.file_descr; + in_pipe : Unix.file_descr; + compare : 'a -> 'a -> int; + select_m : Mutex.t; + mutable tasks : 'a t list; + tasks_m : Mutex.t; + mutable ready : ('a * (unit -> 'a t list)) list; + ready_m : Mutex.t; + mutable queues : Condition.t list; + queues_m : Mutex.t; + mutable stop : bool; + stop_m : Mutex.t; + queue_stopped_c : Condition.t; +} + +let clear_tasks s = + Mutex.lock s.tasks_m; + s.tasks <- []; + Mutex.unlock s.tasks_m + +let create ?(compare = compare) () = + let out_pipe, in_pipe = Unix.pipe () in + { + out_pipe; + in_pipe; + compare; + select_m = Mutex.create (); + tasks = []; + tasks_m = Mutex.create (); + ready = []; + ready_m = Mutex.create (); + queues = []; + queues_m = Mutex.create (); + stop = false; + stop_m = Mutex.create (); + queue_stopped_c = Condition.create (); + } + +let wake_up s = ignore (Unix.write s.in_pipe (Bytes.of_string "x") 0 1) + +module Task = struct + (** Events and tasks from the user's point-of-view. *) + + type event = + [ `Delay of float | `Write of fd | `Read of fd | `Exception of fd ] + + type ('a, 'b) task = { + priority : 'a; + events : 'b list; + handler : 'b list -> ('a, 'b) task list; + } + + let time () = Unix.gettimeofday () + + let rec t_of_task (task : ('a, [< event ]) task) = + let t0 = time () in + { + timestamp = t0; + prio = task.priority; + enrich = + (fun e -> + List.fold_left + (fun e -> function `Delay s -> { e with t = min e.t (t0 +. s) } + | `Read s -> { e with r = s :: e.r } + | `Write s -> { e with w = s :: e.w } + | `Exception s -> { e with x = s :: e.x }) + e task.events); + is_ready = + (fun e -> + let l = + List.filter + (fun evt -> + match (evt :> event) with + | `Delay s when time () > t0 +. s -> true + | `Read s when List.mem s e.r -> true + | `Write s when List.mem s e.w -> true + | `Exception s when List.mem s e.x -> true + | _ -> false) + task.events + in + if l = [] then None + else Some (fun () -> List.map t_of_task (task.handler l))); + } + + let add_t s items = + let f item = + match item.is_ready { r = []; w = []; x = []; t = 0. } with + | Some f -> + Mutex.lock s.ready_m; + s.ready <- (item.prio, f) :: s.ready; + Mutex.unlock s.ready_m + | None -> + Mutex.lock s.tasks_m; + s.tasks <- item :: s.tasks; + Mutex.unlock s.tasks_m + in + List.iter f items; + wake_up s + + let add s t = add_t s [t_of_task t] +end + +open Task + +let stop s = + clear_tasks s; + Mutex.lock s.stop_m; + s.stop <- true; + Mutex.unlock s.stop_m; + Mutex.lock s.queues_m; + while List.length s.queues > 0 do + wake_up s; + Mutex.lock s.ready_m; + List.iter Condition.signal s.queues; + Mutex.unlock s.ready_m; + Condition.wait s.queue_stopped_c s.queues_m + done; + Mutex.unlock s.queues_m + +let tmp = Bytes.create 1024 + +(** There should be only one call of #process at a time. + * Process waits for tasks to become ready, and moves ready tasks + * to the ready queue. *) +let process s log = + (* Compute the union of all events. *) + let e = + List.fold_left + (fun e t -> t.enrich e) + { r = [s.out_pipe]; w = []; x = []; t = infinity } + s.tasks + in + (* Poll for an event. *) + let r, w, x = + let rec f () = + try + let timeout = if e.t = infinity then -1. else max 0. (e.t -. time ()) in + log + (Printf.sprintf "Enter %s at %f, timeout %f (%d/%d/%d)." select_fname + (time ()) timeout (List.length e.r) (List.length e.w) + (List.length e.x)); + let r, w, x = select e.r e.w e.x timeout in + log + (Printf.sprintf "Left %s at %f (%d/%d/%d)." select_fname (time ()) + (List.length r) (List.length w) (List.length x)); + (r, w, x) + with + | Unix.Unix_error (Unix.EINTR, _, _) -> + (* [EINTR] means that select was interrupted by + * a signal before any of the selected events + * occurred and before the timeout interval expired. + * We catch it and restart.. *) + log (Printf.sprintf "Select interrupted at %f." (time ())); + f () + | e -> + (* Uncaught exception: + * 1) Discards all tasks currently in the loop (we do not know which + * socket caused an error). + * 2) Re-Raise e *) + clear_tasks s; + raise e + in + f () + in + (* Empty the wake_up pipe if needed. *) + let () = + if List.mem s.out_pipe r then + (* For safety, we may absorb more than + * one write. This avoids bad situation + * when exceesive wake_up may fill up the + * pipe's write buffer, causing a wake_up + * to become blocking.. *) + ignore (Unix.read s.out_pipe tmp 0 1024) + in + (* Move ready tasks to the ready list. *) + let e = { r; w; x; t = 0. } in + Mutex.lock s.tasks_m; + (* Split [tasks] into [r]eady and still [w]aiting. *) + let r, w = + List.fold_left + (fun (r, w) t -> + match t.is_ready e with + | Some f -> ((t.prio, f) :: r, w) + | None -> (r, t :: w)) + ([], []) s.tasks + in + s.tasks <- w; + Mutex.unlock s.tasks_m; + Mutex.lock s.ready_m; + s.ready <- + List.stable_sort (fun (p, _) (p', _) -> s.compare p p') (s.ready @ r); + Mutex.unlock s.ready_m + +(** Code for a queue to process ready tasks. + * Returns true a task was found (and hence processed). + * + * s.ready_m *must* be locked before calling + * this function, and is freed *only* + * if some task was processed. *) +let exec s (priorities : 'a -> bool) = + (* This assertion does not work on + * win32 because a thread can double-lock + * the same mutex.. *) + if Sys.os_type <> "Win32" then assert (not (Mutex.try_lock s.ready_m)); + try + let (_, task), remaining = remove (fun (p, _) -> priorities p) s.ready in + s.ready <- remaining; + Mutex.unlock s.ready_m; + add_t s (task ()); + true + with Not_found -> false + +exception Queue_stopped +exception Queue_processed + +(** Main loop for queues. *) +let queue ?log ?(priorities = fun _ -> true) s name = + let log = + match log with Some e -> e | None -> Printf.printf "queue %s: %s\n" name + in + let c = + let c = Condition.create () in + Mutex.lock s.queues_m; + s.queues <- c :: s.queues; + Mutex.unlock s.queues_m; + log (Printf.sprintf "Queue #%d starting..." (List.length s.queues)); + c + in + (* Try to process ready tasks, otherwise try to become the master, + * or be a slave and wait for the master to get some more ready tasks. *) + let run () = + Mutex.lock s.stop_m; + let stop = s.stop in + Mutex.unlock s.stop_m; + if stop then raise Queue_stopped; + (* Lock the ready tasks until the queue has a task to proceed, + * *or* is really ready to restart on its condition, see the + * Condition.wait call below for the atomic unlock and wait. *) + Mutex.lock s.ready_m; + log (Printf.sprintf "There are %d ready tasks." (List.length s.ready)); + if exec s priorities then raise Queue_processed; + let wake () = + let is_ready = + Mutex.lock s.ready_m; + let is_ready = s.ready <> [] in + Mutex.unlock s.ready_m; + is_ready + in + (* Wake up other queues if there are remaining tasks *) + if is_ready then begin + Mutex.lock s.queues_m; + List.iter (fun x -> if x <> c then Condition.signal x) s.queues; + Mutex.unlock s.queues_m + end + in + if Mutex.try_lock s.select_m then begin + (* Processing finished for me + * I can unlock ready_m now.. *) + Mutex.unlock s.ready_m; + process s log; + Mutex.unlock s.select_m; + wake (); + end + else begin + (* We use s.ready_m mutex here. + * Hence, we avoid race conditions + * with any other queue being processing + * a task that would create a new task: + * without this mutex, the new task may not be + * notified to this queue if it is going to sleep + * in concurrency.. + * It also avoid race conditions when restarting + * queues since s.ready_m is locked until all + * queues have been signaled. *) + Condition.wait c s.ready_m; + Mutex.unlock s.ready_m + end + in + let rec f () = + begin + try run () with Queue_processed -> () + end; + (f [@tailcall]) () + in + let on_done () = + Mutex.lock s.queues_m; + s.queues <- List.filter (fun q -> q <> c) s.queues; + Condition.signal s.queue_stopped_c; + Mutex.unlock s.queues_m + in + ( try f () with + | Queue_stopped -> () + | exn -> + on_done (); + raise exn ); + on_done () + +module Async = struct + (* m is used to make sure that + * calls to [wake_up] and [stop] + * are thread-safe. *) + type t = { stop : bool ref; mutable fd : fd option; m : Mutex.t } + + exception Stopped + + let add ~priority (scheduler : 'a scheduler) f = + (* A pipe to wake up the task *) + let out_pipe, in_pipe = Unix.pipe () in + let stop = ref false in + let tmp = Bytes.create 1024 in + let rec task l = + if List.exists (( = ) (`Read out_pipe)) l then + (* Consume data from the pipe *) + ignore (Unix.read out_pipe tmp 0 1024); + if !stop then begin + begin + try + (* This interface is purely asynchronous + * so we close both sides of the pipe here. *) + Unix.close in_pipe; + Unix.close out_pipe + with _ -> () + end; + [] + end + else begin + let delay = f () in + let event = if delay >= 0. then [`Delay delay] else [] in + [{ priority; events = `Read out_pipe :: event; handler = task }] + end + in + let task = { priority; events = [`Read out_pipe]; handler = task } in + add scheduler task; + { stop; fd = Some in_pipe; m = Mutex.create () } + + let wake_up t = + Mutex.lock t.m; + try + begin + match t.fd with + | Some t -> ignore (Unix.write t (Bytes.of_string " ") 0 1) + | None -> raise Stopped + end; + Mutex.unlock t.m + with e -> + Mutex.unlock t.m; + raise e + + let stop t = + Mutex.lock t.m; + try + begin + match t.fd with + | Some c -> + t.stop := true; + ignore (Unix.write c (Bytes.of_string " ") 0 1) + | None -> raise Stopped + end; + t.fd <- None; + Mutex.unlock t.m + with e -> + Mutex.unlock t.m; + raise e +end + +module type Transport_t = sig + type t + + type bigarray = + (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t + + val sock : t -> Unix.file_descr + val read : t -> Bytes.t -> int -> int -> int + val write : t -> Bytes.t -> int -> int -> int + val ba_write : t -> bigarray -> int -> int -> int +end + +module Unix_transport : Transport_t with type t = Unix.file_descr = struct + type t = Unix.file_descr + + type bigarray = + (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t + + let sock s = s + let read = Unix.read + let write = Unix.write + + external ba_write : t -> bigarray -> int -> int -> int + = "ocaml_duppy_write_ba" +end + +module type Io_t = sig + type socket + type marker = Length of int | Split of string + + type bigarray = + (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t + + type failure = + | Io_error + | Unix of Unix.error * string * string + | Unknown of exn + | Timeout + + val read : + ?recursive:bool -> + ?init:string -> + ?on_error:(string * failure -> unit) -> + ?timeout:float -> + priority:'a -> + 'a scheduler -> + socket -> + marker -> + (string * string option -> unit) -> + unit + + val write : + ?exec:(unit -> unit) -> + ?on_error:(failure -> unit) -> + ?bigarray:bigarray -> + ?offset:int -> + ?length:int -> + ?string:Bytes.t -> + ?timeout:float -> + priority:'a -> + 'a scheduler -> + socket -> + unit +end + +module MakeIo (Transport : Transport_t) : Io_t with type socket = Transport.t = +struct + type socket = Transport.t + type marker = Length of int | Split of string + + type failure = + | Io_error + | Unix of Unix.error * string * string + | Unknown of exn + | Timeout + + exception Io + exception Timeout_exc + + type bigarray = + (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t + + let read ?(recursive = false) ?(init = "") ?(on_error = fun _ -> ()) ?timeout + ~priority (scheduler : 'a scheduler) socket marker exec = + let length = 1024 in + let b = Buffer.create length in + let buf = Bytes.make length ' ' in + Buffer.add_string b init; + let unix_socket = Transport.sock socket in + let events, check_timeout = + match timeout with + | None -> ([`Read unix_socket], fun _ -> false) + | Some f -> ([`Read unix_socket; `Delay f], List.mem (`Delay f)) + in + let rec f l = + if check_timeout l then raise Timeout_exc; + if List.mem (`Read unix_socket) l then begin + let input = Transport.read socket buf 0 length in + if input <= 0 then raise Io; + Buffer.add_subbytes b buf 0 input + end; + let ret = + match marker with + | Split r -> + let rex = Pcre.regexp r in + let acc = Buffer.contents b in + let ret = Pcre.full_split ~max:2 ~rex acc in + let rec p l = + match l with + | Pcre.Text x :: Pcre.Delim _ :: l -> + let f b x = + match x with + | Pcre.Text s | Pcre.Delim s -> Buffer.add_string b s + | _ -> () + in + if recursive then begin + Buffer.reset b; + List.iter (f b) l; + Some (x, None) + end + else begin + let b = Buffer.create 10 in + List.iter (f b) l; + Some (x, Some (Buffer.contents b)) + end + | _ :: l' -> p l' + | [] -> None + in + p ret + | Length n when n <= Buffer.length b -> + let s = Buffer.sub b 0 n in + let rem = Buffer.sub b n (Buffer.length b - n) in + if recursive then begin + Buffer.reset b; + Buffer.add_string b rem; + Some (s, None) + end + else Some (s, Some rem) + | _ -> None + in + (* Catch all exceptions.. *) + let f x = + try f x with + | Io -> + on_error (Buffer.contents b, Io_error); + [] + | Timeout_exc -> + on_error (Buffer.contents b, Timeout); + [] + | Unix.Unix_error (x, y, z) -> + on_error (Buffer.contents b, Unix (x, y, z)); + [] + | e -> + on_error (Buffer.contents b, Unknown e); + [] + in + match ret with + | Some x -> ( + match x with + | s, Some _ when recursive -> + exec (s, None); + [{ priority; events; handler = f }] + | _ -> + exec x; + [] ) + | None -> [{ priority; events; handler = f }] + in + (* Catch all exceptions.. *) + let f x = + try f x with + | Io -> + on_error (Buffer.contents b, Io_error); + [] + | Timeout_exc -> + on_error (Buffer.contents b, Timeout); + [] + | Unix.Unix_error (x, y, z) -> + on_error (Buffer.contents b, Unix (x, y, z)); + [] + | e -> + on_error (Buffer.contents b, Unknown e); + [] + in + (* First one is without read, + * in case init contains the wanted match. + * Unless the user sets timeout to 0., this + * should not interfer with user-defined timeout.. *) + let task = + { priority; events = [`Delay 0.; `Read unix_socket]; handler = f } + in + add scheduler task + + let write ?(exec = fun () -> ()) ?(on_error = fun _ -> ()) ?bigarray + ?(offset = 0) ?length ?string ?timeout ~priority + (scheduler : 'a scheduler) socket = + let length, write = + match (string, bigarray) with + | Some s, _ -> + let length = + match length with Some length -> length | None -> Bytes.length s + in + (length, Transport.write socket s) + | None, Some b -> + let length = + match length with + | Some length -> length + | None -> Bigarray.Array1.dim b + in + (length, Transport.ba_write socket b) + | _ -> (0, fun _ _ -> 0) + in + let unix_socket = Transport.sock (socket : Transport.t) in + let exec () = + if Sys.os_type = "Win32" then Unix.clear_nonblock unix_socket; + exec () + in + let events, check_timeout = + match timeout with + | None -> ([`Write unix_socket], fun _ -> false) + | Some f -> ([`Write unix_socket; `Delay f], List.mem (`Delay f)) + in + let rec f pos l = + try + if check_timeout l then raise Timeout_exc; + assert (List.exists (( = ) (`Write unix_socket)) l); + let len = length - pos in + let n = write pos len in + if n <= 0 then ( + on_error Io_error; + [] ) + else if n < len then + [{ priority; events = [`Write unix_socket]; handler = f (pos + n) }] + else ( + exec (); + [] ) + with + | Unix.Unix_error (Unix.EWOULDBLOCK, _, _) when Sys.os_type = "Win32" -> + [{ priority; events = [`Write unix_socket]; handler = f pos }] + | Timeout_exc -> + on_error Timeout; + [] + | Unix.Unix_error (x, y, z) -> + on_error (Unix (x, y, z)); + [] + | e -> + on_error (Unknown e); + [] + in + let task = { priority; events; handler = f offset } in + if length > 0 then + (* Win32 is particularly bad with writting on sockets. It is nearly impossible + * to write proper non-blocking code. send will block on blocking sockets if + * there isn't enough data available instead of returning a partial buffer + * and WSAEventSelect will not return if the socket still has available space. + * Thus, setting the socket to non-blocking and writting as much as we can. *) + if Sys.os_type = "Win32" then begin + Unix.set_nonblock unix_socket; + List.iter (add scheduler) (f offset [`Write unix_socket]) + end + else add scheduler task + else exec () +end + +module Io : Io_t with type socket = Unix.file_descr = MakeIo (Unix_transport) + +(** A monad for implicit continuations or responses *) +module Monad = struct + type ('a, 'b) handler = { return : 'a -> unit; raise : 'b -> unit } + type ('a, 'b) t = ('a, 'b) handler -> unit + + let return x h = h.return x + let raise x h = h.raise x + + let bind f g h = + let ret x = + let process = g x in + process h + in + f { return = ret; raise = h.raise } + + let ( >>= ) = bind + let run ~return:ret ~raise f = f { return = ret; raise } + + let catch f g h = + let raise x = + let process = g x in + process h + in + f { return = h.return; raise } + + let ( =<< ) x y = catch y x + + let rec fold_left f a = function + | [] -> a + | b :: l -> fold_left f (bind a (fun a -> f a b)) l + + let fold_left f a l = fold_left f (return a) l + let iter f l = fold_left (fun () b -> f b) () l + + module Mutex_o = Mutex + + module Mutex = struct + module type Mutex_control = sig + type priority + + val scheduler : priority scheduler + val priority : priority + end + + module type Mutex_t = sig + (** Type for a mutex. *) + type mutex + + module Control : Mutex_control + + (** [create ()] creates a mutex. Implementation-wise, + * a duppy task is created that will be used to select a + * waiting computation, lock the mutex on it and resume it. + * Thus, [priority] and [s] represents, resp., the priority + * and scheduler used when running calling process' computation. *) + val create : unit -> mutex + + (** A computation that locks a mutex + * and returns [unit] afterwards. Computation + * will be blocked until the mutex is sucessfuly locked. *) + val lock : mutex -> (unit, 'a) t + + (** A computation that tries to lock a mutex. + * Returns immediatly [true] if the mutex was sucesfully locked + * or [false] otherwise. *) + val try_lock : mutex -> (bool, 'a) t + + (** A computation that unlocks a mutex. + * Should return immediatly. *) + val unlock : mutex -> (unit, 'a) t + end + + module Factory (Control : Mutex_control) = struct + (* A mutex is either locked or not + * and has a list of tasks waiting to get + * it. *) + type mutex = { + mutable locked : bool; + mutable tasks : (unit -> unit) list; + } + + module Control = Control + + let tmp = Bytes.create 1024 + let x, y = Unix.pipe () + let stop = ref false + let wake_up () = ignore (Unix.write y (Bytes.of_string " ") 0 1) + let ctl_m = Mutex_o.create () + + let finalise _ = + stop := true; + wake_up () + + let mutexes = Queue.create () + let () = Gc.finalise finalise mutexes + + let register () = + let m = { locked = false; tasks = [] } in + Queue.push m mutexes; + m + + let cleanup m = + Mutex_o.lock ctl_m; + let q = Queue.create () in + Queue.iter (fun m' -> if m <> m' then Queue.push m q) mutexes; + Queue.clear mutexes; + Queue.transfer q mutexes; + Mutex_o.unlock ctl_m + + let task f = + { + Task.priority = Control.priority; + events = [`Delay 0.]; + handler = + (fun _ -> + f (); + []); + } + + (* This should only be called when [ctl_m] is locked. *) + let process_mutex tasks m = + if not m.locked then ( + (* I don't think shuffling tasks + * matters here.. *) + match m.tasks with + | x :: l -> + m.tasks <- l; + m.locked <- true; + task x :: tasks + | _ -> tasks ) + else tasks + + let rec handler _ = + Mutex_o.lock ctl_m; + if not !stop then begin + let tasks = Queue.fold process_mutex [] mutexes in + Mutex_o.unlock ctl_m; + ignore (Unix.read x tmp 0 1024); + { Task.priority = Control.priority; events = [`Read x]; handler } + :: tasks + end + else begin + Mutex_o.unlock ctl_m; + try + Unix.close x; + Unix.close y; + [] + with _ -> [] + end + + let () = + Task.add Control.scheduler + { Task.priority = Control.priority; events = [`Read x]; handler } + + let create () = + Mutex_o.lock ctl_m; + let ret = register () in + Mutex_o.unlock ctl_m; + Gc.finalise cleanup ret; + ret + + let lock m h' = + Mutex_o.lock ctl_m; + if not m.locked then begin + m.locked <- true; + Mutex_o.unlock ctl_m; + h'.return () + end + else begin + m.tasks <- h'.return :: m.tasks; + Mutex_o.unlock ctl_m + end + + let try_lock m h' = + Mutex_o.lock ctl_m; + if not m.locked then begin + m.locked <- true; + Mutex_o.unlock ctl_m; + h'.return true + end + else begin + Mutex_o.unlock ctl_m; + h'.return false + end + + let unlock m h' = + Mutex_o.lock ctl_m; + (* Here we allow inter-thread + * and double unlock.. Double unlock + * is not necessarily a problem and + * inter-thread unlock well.. what is + * a thread here ?? :-) *) + m.locked <- false; + let wake = m.tasks <> [] in + Mutex_o.unlock ctl_m; + if wake then wake_up (); + h'.return () + end + end + + module Condition = struct + module Factory (Mutex : Mutex.Mutex_t) = struct + type condition = { + condition_m : Mutex_o.t; + waiting : (unit -> unit) Queue.t; + } + + module Control = Mutex.Control + + let create () = + { condition_m = Mutex_o.create (); waiting = Queue.create () } + + (* Mutex.unlock m needs to happen _after_ + * the task has been registered. *) + let wait c m h = + let proc () = Mutex.lock m h in + Mutex_o.lock c.condition_m; + Queue.push proc c.waiting; + Mutex_o.unlock c.condition_m; + (* Mutex.unlock does not raise exceptions (for now..) *) + let h' = { return = (fun () -> ()); raise = (fun _ -> assert false) } in + Mutex.unlock m h' + + let wake_up h = + let handler _ = + h (); + [] + in + Task.add Control.scheduler + { Task.priority = Control.priority; events = [`Delay 0.]; handler } + + let signal c h = + Mutex_o.lock c.condition_m; + let h' = Queue.pop c.waiting in + Mutex_o.unlock c.condition_m; + wake_up h'; + h.return () + + let broadcast c h = + let q = Queue.create () in + Mutex_o.lock c.condition_m; + Queue.transfer c.waiting q; + Mutex_o.unlock c.condition_m; + Queue.iter wake_up q; + h.return () + end + end + + module type Monad_io_t = sig + type socket + + module Io : Io_t with type socket = socket + + type ('a, 'b) handler = { + scheduler : 'a scheduler; + socket : Io.socket; + mutable data : string; + on_error : Io.failure -> 'b; + } + + val exec : + ?delay:float -> + priority:'a -> + ('a, 'b) handler -> + ('c, 'b) t -> + ('c, 'b) t + + val delay : priority:'a -> ('a, 'b) handler -> float -> (unit, 'b) t + + val read : + ?timeout:float -> + priority:'a -> + marker:Io.marker -> + ('a, 'b) handler -> + (string, 'b) t + + val read_all : + ?timeout:float -> + priority:'a -> + 'a scheduler -> + Io.socket -> + (string, string * Io.failure) t + + val write : + ?timeout:float -> + priority:'a -> + ('a, 'b) handler -> + ?offset:int -> + ?length:int -> + Bytes.t -> + (unit, 'b) t + + val write_bigarray : + ?timeout:float -> + priority:'a -> + ('a, 'b) handler -> + Io.bigarray -> + (unit, 'b) t + end + + module MakeIo (Io : Io_t) = struct + type socket = Io.socket + + module Io = Io + + type ('a, 'b) handler = { + scheduler : 'a scheduler; + socket : Io.socket; + mutable data : string; + on_error : Io.failure -> 'b; + } + + let exec ?(delay = 0.) ~priority h f h' = + let handler _ = + begin + try f h' with e -> h'.raise (h.on_error (Io.Unknown e)) + end; + [] + in + Task.add h.scheduler { Task.priority; events = [`Delay delay]; handler } + + let delay ~priority h delay = exec ~delay ~priority h (return ()) + + let read ?timeout ~priority ~marker h h' = + let process x = + let s = + match x with + | s, None -> + h.data <- ""; + s + | s, Some s' -> + h.data <- s'; + s + in + h'.return s + in + let init = h.data in + h.data <- ""; + let on_error (s, x) = + h.data <- s; + h'.raise (h.on_error x) + in + Io.read ?timeout ~priority ~init ~recursive:false ~on_error h.scheduler + h.socket marker process + + let read_all ?timeout ~priority s sock = + let handler = + { scheduler = s; socket = sock; data = ""; on_error = (fun e -> e) } + in + let buf = Buffer.create 1024 in + let rec f () = + let data = read ?timeout ~priority ~marker:(Io.Length 1024) handler in + let process data = + Buffer.add_string buf data; + f () + in + data >>= process + in + let catch_ret e = + Buffer.add_string buf handler.data; + match e with + | Io.Io_error -> return (Buffer.contents buf) + | e -> raise (Buffer.contents buf, e) + in + catch (f ()) catch_ret + + let write ?timeout ~priority h ?offset ?length s h' = + let on_error x = h'.raise (h.on_error x) in + let exec () = h'.return () in + Io.write ?timeout ~priority ~on_error ~exec ?offset ?length ~string:s + h.scheduler h.socket + + let write_bigarray ?timeout ~priority h ba h' = + let on_error x = h'.raise (h.on_error x) in + let exec () = h'.return () in + Io.write ?timeout ~priority ~on_error ~exec ~bigarray:ba h.scheduler + h.socket + end + + module Io = MakeIo (Io) +end diff --git a/src/duppy.mli b/src/duppy.mli new file mode 100644 index 0000000..be0a4d6 --- /dev/null +++ b/src/duppy.mli @@ -0,0 +1,549 @@ +(***************************************************************************** + + Duppy, a task scheduler for OCaml. + Copyright 2003-2010 Savonet team + + 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 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, fully stated in the COPYING + file at the root of the liquidsoap distribution. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + *****************************************************************************) + +(** Advanced scheduler and monad for server-oriented programming. *) + +(** + * {R {i {v + * The bars could not hold me; + * Force could not control me now. + * They try to keep me down, yeah! + * But Jah put I around. + * (...) + * Let me tell you this - + * I'm a duppy conqueror ! + * v} } } + * {R {b Lee "Scratch" Perry & Bob Marley - Duppy conqueror }} + * + * {2 Duppy task scheduler for OCaml.} + * + * {!Duppy} is a task scheduler for ocaml. It implements a wrapper + * around [Unix.select]. + * + * Using {!Duppy.Task}, the programmer can easily submit tasks that need to wait + * on a socket even, or for a given timeout (possibly zero). + * + * With {!Duppy.Async}, one can use a scheduler to submit asynchronous tasks. + * + * {!Duppy.Io} implements recursive easy reading and writing to a [Unix.file_descr] + * + * Finally, {!Duppy.Monad} and {!Duppy.Monad.Io} provide a monadic interface to + * program server code that with an implicit return/reply execution flow. + * + * The scheduler can use several queues running concurently, each queue + * processing ready tasks. Of course, a queue should run in its own thread.*) + +(** A scheduler is a device for processing tasks. Several queues might run in + * different threads, processing one scheduler's tasks. + * + * ['a] is the type of objects used for priorities. *) +type 'a scheduler + +(** Initiate a new scheduler + * @param compare the comparison function used to sort tasks according to priorities. + * Works as in [List.sort] *) +val create : ?compare:('a -> 'a -> int) -> unit -> 'a scheduler + +(** [queue ~log ~priorities s name] + * starts a queue, on the scheduler [s] only processing priorities [p] + * for which [priorities p] returns [true]. + * + * Several queues can be run concurrently against [s]. + * @param log Logging function. Default: [Printf.printf "queue %s: %s\n" name] + * @param priorities Predicate specifying which priority to process. Default: [fun _ -> _ -> true] + * + * An exception is raised from this call when duppy's event loops has + * crashed. This exception should be considered a MAJOR FAILURE. All current + * non-ready tasks registered for the calling scheduler are dropped. You may + * restart Duppy's queues after it is raised but it should only be used to terminate + * the process diligently!! *) +val queue : + ?log:(string -> unit) -> + ?priorities:('a -> bool) -> + 'a scheduler -> + string -> + unit + +(** Stop all queues running on that scheduler and wait for them to return. *) +val stop : 'a scheduler -> unit + +(** Core task registration. + * + * A task will be a set of events to watch, and a corresponding function to + * execute when one of the events is trigered. + * + * The executed function may then return a list of new tasks to schedule. *) +module Task : sig + (** A task is a list of events awaited, + * and a function to process events that have occured. + * + * The ['a] parameter is the type of priorities, ['b] will be a subset of possible + * events. *) + type ('a, 'b) task = { + priority : 'a; + events : 'b list; + handler : 'b list -> ('a, 'b) task list; + } + + (** Type for possible events. + * + * Please not that currently, under win32, all socket used in ocaml-duppy + * are expected to be in blocking mode only! *) + type event = + [ `Delay of float + | `Write of Unix.file_descr + | `Read of Unix.file_descr + | `Exception of Unix.file_descr ] + + (** Schedule a task. *) + val add : 'a scheduler -> ('a, [< event ]) task -> unit +end + +(** Asynchronous task module + * + * This module implements an asychronous API to {!Duppy.scheduler} + * It allows to create a task that will run and then go to sleep. *) +module Async : sig + type t + + (** Exception raised when trying to wake_up a task + * that has been previously stopped *) + exception Stopped + + (** [add ~priority s f] creates an asynchronous task in [s] with + * priority [priority]. + * + * The task executes the function [f]. + * If the task returns a positive float, the function will be executed + * again after this delay. Otherwise it goes to sleep, and + * you can use [wake_up] to resume the task and execute [f] again. + * Only a single call to [f] is done at each time. + * Multiple [wake_up] while previous task has not + * finished will result in sequentialized calls to [f]. *) + val add : priority:'a -> 'a scheduler -> (unit -> float) -> t + + (** Wake up an asynchronous task. + * Raises [Stopped] if the task has been stopped. *) + val wake_up : t -> unit + + (** Stop and remove the asynchronous task. Doesn't quit a running task. + * Raises [Stopped] if the task has been stopped. *) + val stop : t -> unit +end + +(** Module type for Io functor. *) +module type Transport_t = sig + type t + + type bigarray = + (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t + + val sock : t -> Unix.file_descr + val read : t -> Bytes.t -> int -> int -> int + val write : t -> Bytes.t -> int -> int -> int + val ba_write : t -> bigarray -> int -> int -> int +end + +(** Easy parsing of [Unix.file_descr]. + * + * With {!Duppy.Io.read}, you can pass a file descriptor to the scheduler, + * along with a marker, and have it run the associated function when the + * marker is found. + * + * With {!Duppy.Io.write}, the schdeduler will try to write recursively to the file descriptor + * the given string. *) +module type Io_t = sig + type socket + + (** Type for markers. + * + * [Split s] recognizes all regexp allowed by the + * [Pcre] module. *) + type marker = Length of int | Split of string + + (** Type of [Bigarray] used here. *) + type bigarray = + (char, Bigarray.int8_unsigned_elt, Bigarray.c_layout) Bigarray.Array1.t + + (** Different types of failure. + * + * [Io_error] is raised when reading or writing + * returned 0. This usually means that the socket + * was closed. *) + type failure = + | Io_error + | Unix of Unix.error * string * string + | Unknown of exn + | Timeout + + (** Wrapper to perform a read on a socket and trigger a function when + * a marker has been detected, or enough data has been read. + * It reads recursively on a socket, splitting into strings seperated + * by the marker (if any) and calls the given function on the list of strings. + * + * Can be used recursively or not, depending on the way you process strings. + * Because of Unix's semantic, it is not possible to stop reading + * at first marker, so there can be a remaining string. If not used + * recursively, the second optional argument may contain a remaining + * string. You should then initiate the next read with this value. + * + * The [on_error] function is used when reading failed on the socket. + * Depending on your usage, it can be a hard failure, or simply a lost client. + * The string passed to [on_error] contains data read before error + * occured. + * @param recursive recursively read and process, default: [true] + * @param init initial string for reading, default: [""] + * @param on_error function used when read failed, default: [fun _ -> ()] + * @param timeout Terminate with [Timeout] failure if nothing has been read + * after the given amout of time in seconds. More precisely, + * the exception is raised when no character have been read + * and the socket was not close while waiting. Default: wait + * forever. *) + val read : + ?recursive:bool -> + ?init:string -> + ?on_error:(string * failure -> unit) -> + ?timeout:float -> + priority:'a -> + 'a scheduler -> + socket -> + marker -> + (string * string option -> unit) -> + unit + + (** Similar to [read] but less complex. + * [write ?exec ?on_error ?string ?bigarray ~priority scheduler socket] + * write data from [string], or from [bigarray] if no string is given, + * to [socket], and executes [exec] or [on_error] if errors occured. + * + * Caveat: on Win32, all file descriptors are expected to be in blocking + * mode before being passed to this call due to limitations in the emulation + * of the unix/posix API. See code comments for more details. + * + * @param exec function to execute after writing, default: [fun () -> ()] + * @param on_error function to execute when an error occured, default: [fun _ -> ()] + * @param string write data from this string + * @param bigarray write data from this bigarray, if no [string] is given + * @param timeout Terminate with [Timeout] failure if nothing has been written + * after the given amout of time in seconds. More precisely, + * the exception is raised when no character have been written + * and the socket was not close while waiting. Default: wait + * forever. *) + val write : + ?exec:(unit -> unit) -> + ?on_error:(failure -> unit) -> + ?bigarray:bigarray -> + ?offset:int -> + ?length:int -> + ?string:Bytes.t -> + ?timeout:float -> + priority:'a -> + 'a scheduler -> + socket -> + unit +end + +module MakeIo (Transport : Transport_t) : Io_t with type socket = Transport.t +module Io : Io_t with type socket = Unix.file_descr + +(** Monadic interface to {!Duppy.Io}. + * + * This module can be used to write code + * that runs in various Duppy's tasks and + * raise values in a completely transparent way. + * + * You can see examples of its use + * in the [examples/] directory of the + * source code and in the files + * [src/tools/{harbor.camlp4,server.camlp4}] + * in liquidsoap's code. + * + * When a server communicates + * with a client, it performs several + * computations and, eventually, terminates. + * A computation can either return a new + * value or terminate. For instance: + * + * - Client connects. + * - Server tries to authenticate the client. + * - If authentication is ok, proceed with the next step. + * - Otherwise terminate. + * + * The purpose of the monad is to embed + * computations which can either return + * a new value or raise a value that is used + * to terminate. *) +module Monad : sig + (** Type representing a computation + * which returns a value of type ['a] + * or raises a value of type ['b] *) + type ('a, 'b) t + + (** [return x] create a computation that + * returns value [x]. *) + val return : 'a -> ('a, 'b) t + + (** [raise x] create a computation that raises + * value [x]. *) + val raise : 'b -> ('a, 'b) t + + (** Compose two computations. + * [bind f g] is equivalent to: + * [let x = f in g x] where [x] + * has f's return type. *) + val bind : ('a, 'b) t -> ('a -> ('c, 'b) t) -> ('c, 'b) t + + (** [>>=] is an alternative notation + * for [bind] *) + val ( >>= ) : ('a, 'b) t -> ('a -> ('c, 'b) t) -> ('c, 'b) t + + (** [run f ~return ~raise ()] executes [f] and process + * returned values with [return] or raised values + * with [raise]. *) + val run : return:('a -> unit) -> raise:('b -> unit) -> ('a, 'b) t -> unit + + (** [catch f g] redirects values [x] raised during + * [f]'s execution to [g]. The name suggests the + * usual [try .. with ..] exception catching. *) + val catch : ('a, 'b) t -> ('b -> ('a, 'c) t) -> ('a, 'c) t + + (** [=<<] is an alternative notation for catch. *) + val ( =<< ) : ('b -> ('a, 'c) t) -> ('a, 'b) t -> ('a, 'c) t + + (** [fold_left f a [b1; b2; ..]] returns computation + * [ (f a b1) >>= (fun a -> f a b2) >>= ...] *) + val fold_left : ('a -> 'b -> ('a, 'c) t) -> 'a -> 'b list -> ('a, 'c) t + + (** [iter f [x1; x2; ..]] returns computation + * [f x1 >>= (fun () -> f x2) >>= ...] *) + val iter : ('a -> (unit, 'b) t) -> 'a list -> (unit, 'b) t + + (** This module implements monadic + * mutex computations. They can be used + * to write blocking code that is compatible + * with duppy's tasks, i.e. [Mutex.lock m] blocks + * the calling computation and not the calling thread. *) + module Mutex : sig + (** Information used to initialize a Mutex module. + * [priority] and [scheduler] are used to initialize a task + * which treat mutexes as well as conditions from the below + * [Condition] module. *) + module type Mutex_control = sig + type priority + + val scheduler : priority scheduler + val priority : priority + end + + module type Mutex_t = sig + (** Type for a mutex. *) + type mutex + + module Control : Mutex_control + + (** [create ()] creates a mutex. *) + val create : unit -> mutex + + (** A computation that locks a mutex + * and returns [unit] afterwards. Computation + * will be blocked until the mutex is sucessfuly locked. *) + val lock : mutex -> (unit, 'a) t + + (** A computation that tries to lock a mutex. + * Returns immediatly [true] if the mutex was sucesfully locked + * or [false] otherwise. *) + val try_lock : mutex -> (bool, 'a) t + + (** A computation that unlocks a mutex. + * Should return immediatly. *) + val unlock : mutex -> (unit, 'a) t + end + + module Factory (Control : Mutex_control) : Mutex_t + end + + (** This module implements monadic + * condition computations. They can be used + * to write waiting code that is compatible + * with duppy's tasks, i.e. [Condition.wait c m] blocks + * the calling computation and not the calling thread + * until [Condition.signal c] or [Condition.broadcast c] has + * been called. *) + module Condition : sig + module Factory (Mutex : Mutex.Mutex_t) : sig + (** Type of a condition, used in [wait] and [broadcast] *) + type condition + + (** Create a condition. Implementation-wise, + * a duppy task is created that will be used to select a + * waiting computation, and resume it. + * Thus, [priority] and [s] represents, resp., the priority + * and scheduler used when running calling process' computation. *) + val create : unit -> condition + + (** [wait h m] is a computation that: + * {ul + * {- Unlock mutex [m]} + * {- Wait until [Condition.signal c] or [Condition.broadcast c] + has been called} + * {- Locks mutex [m]} + * {- Returns [unit]}} *) + val wait : condition -> Mutex.mutex -> (unit, 'a) t + + (** [broadcast c] is a computation that + * resumes all computations waiting on [c]. It should + * return immediately. *) + val broadcast : condition -> (unit, 'a) t + + (** [signal c] is a computation that resumes one + * computation waiting on [c]. It should return + * immediately. *) + val signal : condition -> (unit, 'a) t + end + end + + (** This module implements monadic computations + * using [Duppy.Io]. It can be used to create + * computations that read or write from a socket, + * and also to redirect a computation in a different + * queue with a new priority. *) + module type Monad_io_t = sig + type socket + + module Io : Io_t with type socket = socket + + (** {2 Type } *) + + (** A handler for this module + * is a record that contains the + * required elements. In particular, + * [on_error] is a function that transforms + * an error raised by [Duppy.Io] to a reply + * used to terminate the computation. + * [data] is an internal data buffer. It should + * be initialized with [""]. It contains the + * remaining data that was received when + * using [read]. If an error occured, + * [data] contain data read before the + * error. *) + type ('a, 'b) handler = { + scheduler : 'a scheduler; + socket : Io.socket; + mutable data : string; + on_error : Io.failure -> 'b; + } + + (** {2 Execution flow } *) + + (** [exec ?delay ~priority h f] redirects computation + * [f] into a new queue with priority [priority] and + * delay [delay] ([0.] by default). + * It can be used to redirect a computation that + * has to run under a different priority. For instance, + * a computation that reads from a socket is generally + * not blocking because the function is executed + * only when some data is available for reading. + * However, if the data that is read needs to be processed + * by a computation that can be blocking, then one may + * use [exec] to redirect this computation into an + * appropriate queue. *) + val exec : + ?delay:float -> + priority:'a -> + ('a, 'b) handler -> + ('c, 'b) t -> + ('c, 'b) t + + (** [delay ~priority h d] creates a computation that returns + * [unit] after delay [d] in seconds. *) + val delay : priority:'a -> ('a, 'b) handler -> float -> (unit, 'b) t + + (** {2 Read/write } *) + + (** [read ?timeout ~priority ~marker h] creates a + * computation that reads from [h.socket] + * and returns the first string split + * according to [marker]. This function + * can be used to create a computation that + * reads data from a socket. [timeout] parameter + * forces the computation to return an error if + * nothing has been read for more than [timeout] + * seconds. Default: wait forever. *) + val read : + ?timeout:float -> + priority:'a -> + marker:Io.marker -> + ('a, 'b) handler -> + (string, 'b) t + + (** [read_all ?timeout ~priority s sock] creates a + * computation that reads all data from [sock] + * and returns it. Raised value contains data + * read before an error occured. *) + val read_all : + ?timeout:float -> + priority:'a -> + 'a scheduler -> + Io.socket -> + (string, string * Io.failure) t + + (** [write ?timeout ~priority h s] creates a computation + * that writes string [s] to [h.socket]. This + * function can be used to create a computation + * that sends data to a socket. [timeout] parameter + * forces the computation to return an error if + * nothing has been written for more than [timeout] + * seconds. Default: wait forever. *) + val write : + ?timeout:float -> + priority:'a -> + ('a, 'b) handler -> + ?offset:int -> + ?length:int -> + Bytes.t -> + (unit, 'b) t + + (** [write_bigarray ?timeout ~priority h ba] creates a computation + * that writes data from [ba] to [h.socket]. This function + * can to create a computation that writes data to a socket. *) + val write_bigarray : + ?timeout:float -> + priority:'a -> + ('a, 'b) handler -> + Io.bigarray -> + (unit, 'b) t + end + + module MakeIo (Io : Io_t) : + Monad_io_t with type socket = Io.socket and module Io = Io + + module Io : Monad_io_t with type socket = Unix.file_descr and module Io = Io +end + +(** {2 Some culture..} + * {e Duppy is a Caribbean patois word of West African origin meaning ghost or spirit. + * Much of Caribbean folklore revolves around duppies. + * Duppies are generally regarded as malevolent spirits. + * They are said to come out and haunt people at night mostly, + * and people from the islands claim to have seen them. + * The 'Rolling Calf', 'Three footed horse' or 'Old Higue' are examples of the more malicious spirits. } + * {R {{:http://en.wikipedia.org/wiki/Duppy} http://en.wikipedia.org/wiki/Duppy}}*) diff --git a/src/duppy_stubs.c b/src/duppy_stubs.c new file mode 100644 index 0000000..ac70284 --- /dev/null +++ b/src/duppy_stubs.c @@ -0,0 +1,176 @@ +/* + * Copyright 2010 Savonet team + * + * This file is part of Ocaml-duppy. + * + * Ocaml-duppy 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. + * + * Ocaml-duppy 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 Ocaml-duppy; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + * + */ + +#include +#include +#include +#include +#include +#include +#include + +#include + +/* On native Windows platforms, many macros are not defined. */ +# if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ + +#ifndef EWOULDBLOCK +#define EWOULDBLOCK EAGAIN +#endif + +#endif + +#ifdef WIN32 +#define Fd_val(fd) win_CRT_fd_of_filedescr(fd) +#define Val_fd(fd) caml_failwith("Val_fd") +#else +#define Fd_val(fd) Int_val(fd) +#define Val_fd(fd) Val_int(fd) +#endif + +#ifndef WIN32 +#include + +CAMLprim value caml_poll(value _read, value _write, value _err, value _timeout) { + CAMLparam3(_read, _write, _err); + CAMLlocal4(_pread, _pwrite, _perr, _ret); + + struct pollfd *fds; + nfds_t nfds = 0; + nfds_t nread = 0; + nfds_t nwrite = 0; + nfds_t nerr = 0; + int timeout; + size_t last = 0; + int n, ret; + + if (Double_val(_timeout) == -1) + timeout = -1; + else + timeout = Double_val(_timeout) * 1000; + + nfds += Wosize_val(_read); + nfds += Wosize_val(_write); + nfds += Wosize_val(_err); + + fds = calloc(nfds,sizeof(struct pollfd)); + if (fds == NULL) caml_raise_out_of_memory(); + + for (n = 0; n < Wosize_val(_read); n++) { + fds[last+n].fd = Fd_val(Field(_read,n)); + fds[last+n].events = POLLIN; + } + last += Wosize_val(_read); + + for (n = 0; n < Wosize_val(_write); n++) { + fds[last+n].fd = Fd_val(Field(_write,n)); + fds[last+n].events = POLLOUT; + } + last += Wosize_val(_write); + + for (n = 0; n < Wosize_val(_err); n++) { + fds[last+n].fd = Fd_val(Field(_err,n)); + fds[last+n].events = POLLERR; + } + + caml_release_runtime_system(); + ret = poll(fds, nfds, timeout); + caml_acquire_runtime_system(); + + if (ret == -1) { + free(fds); + uerror("poll",Nothing); + } + + for (n = 0; n < nfds; n++) { + if (fds[n].revents & POLLIN) + nread++; + if (fds[n].revents & POLLOUT) + nwrite++; + if (fds[n].revents & POLLERR) + nerr++; + } + + _pread = caml_alloc_tuple(nread); + nread = 0; + + _pwrite = caml_alloc_tuple(nwrite); + nwrite = 0; + + _perr = caml_alloc_tuple(nerr); + nerr = 0; + + for (n = 0; n < nfds; n++) { + if (fds[n].revents & POLLIN) { + Store_field(_pread, nread, Val_fd(fds[n].fd)); + nread++; + } + if (fds[n].revents & POLLOUT) { + Store_field(_pwrite, nwrite, Val_fd(fds[n].fd)); + nwrite++; + } + if (fds[n].revents & POLLERR) { + Store_field(_pread, nerr, Val_fd(fds[n].fd)); + nerr++; + } + } + + free(fds); + + _ret = caml_alloc_tuple(3); + Store_field(_ret, 0, _pread); + Store_field(_ret, 1, _pwrite); + Store_field(_ret, 2, _perr); + + CAMLreturn(_ret); +} +#else +CAMLprim value caml_poll(value _read, value _write, value _err, value _timeout) { + caml_failwith("caml_poll"); +} +#endif + +CAMLprim value ocaml_duppy_write_ba(value _fd, value ba, value _ofs, value _len) +{ + CAMLparam2(ba,_fd) ; + int fd = Fd_val(_fd); + long ofs = Long_val(_ofs); + long len = Long_val(_len); + void *buf = Caml_ba_data_val(ba); + int ret; + + int written = 0; + while (len > 0) { + caml_enter_blocking_section(); + ret = write(fd, buf+ofs, len); + caml_leave_blocking_section(); + if (ret == -1) { + if ((errno == EAGAIN || errno == EWOULDBLOCK) && written > 0) break; + uerror("write", Nothing); + } + written += ret; + ofs += ret; + len -= ret; + } + + CAMLreturn(Val_long(written)); +} + -- cgit v1.2.3 From 336e6aaec40945b7843b0a2d370f5f037dc313b9 Mon Sep 17 00:00:00 2001 From: Kyle Robbertze Date: Sun, 13 Nov 2022 17:09:56 +0100 Subject: Import ocaml-duppy_0.9.2-2.debian.tar.xz [dgit import tarball ocaml-duppy 0.9.2-2 ocaml-duppy_0.9.2-2.debian.tar.xz] --- changelog | 198 ++++++++++++++++++++++++++++++++++++++++++ control | 45 ++++++++++ copyright | 51 +++++++++++ gbp.conf | 2 + libduppy-ocaml-dev.docs | 1 + libduppy-ocaml-dev.install.in | 6 ++ libduppy-ocaml.install.in | 1 + rules | 15 ++++ source/format | 1 + upstream/metadata | 5 ++ watch | 2 + 11 files changed, 327 insertions(+) create mode 100644 changelog create mode 100644 control create mode 100644 copyright create mode 100644 gbp.conf create mode 100644 libduppy-ocaml-dev.docs create mode 100644 libduppy-ocaml-dev.install.in create mode 100644 libduppy-ocaml.install.in create mode 100755 rules create mode 100644 source/format create mode 100644 upstream/metadata create mode 100644 watch diff --git a/changelog b/changelog new file mode 100644 index 0000000..fa377aa --- /dev/null +++ b/changelog @@ -0,0 +1,198 @@ +ocaml-duppy (0.9.2-2) unstable; urgency=low + + [ Debian Janitor ] + * Remove constraints unnecessary since buster + * Use secure URI in Homepage field. + * Update standards version to 4.6.1, no changes needed. + + [ Kyle Robbertze ] + * d/control: depend on shlibs + + -- Kyle Robbertze Sun, 13 Nov 2022 18:09:56 +0200 + +ocaml-duppy (0.9.2-1) unstable; urgency=medium + + [ Stéphane Glondu ] + * Team upload + * New upstream release + * Bump Standards-Version to 4.6.0 + * Bump debhelper compat level to 13 + * Add Rules-Requires-Root: no + * Remove Samuel and Romain from Uploaders + + [ Kyle Robbertze ] + * Update maintainer email + + [ Debian Janitor ] + * Trim trailing whitespace. + * Set upstream metadata fields: Bug-Database, Bug-Submit, Repository, + Repository-Browse. + + -- Stéphane Glondu Sun, 28 Nov 2021 17:37:56 +0100 + +ocaml-duppy (0.8.0-1) unstable; urgency=medium + + * New upstream version 0.8.0 + * Drop useless build-dep on camlp4 + * Remove copyright attached to deleted files + + -- Kyle Robbertze Mon, 26 Nov 2018 15:36:28 +0200 + +ocaml-duppy (0.7.3-1) unstable; urgency=low + + * New upstream version 0.7.3 + + -- Kyle Robbertze Mon, 17 Sep 2018 08:59:44 +0200 + +ocaml-duppy (0.7.2-1) unstable; urgency=low + + * New upstream version 0.7.2 + * Bump copyright years and add new copyright entries + + -- Kyle Robbertze Mon, 03 Sep 2018 10:07:03 +0200 + +ocaml-duppy (0.7.1-1) unstable; urgency=low + + * New upstream version 0.7.1 + * Bump Standards-Version to 4.2.1 (no change) + + -- Kyle Robbertze Mon, 27 Aug 2018 10:12:59 +0200 + +ocaml-duppy (0.7.0-1) unstable; urgency=medium + + * New upstream version 0.7.0 + * debian/watch: update watch file url + * debian/copyright: use machine-readable format + * debian/control: Add new Uploader + Bump standards version to 4.1.4 + * debian/compat: bump compat version to 10 + * debian/source/format: use quilt patch format + + -- Kyle Robbertze Fri, 04 May 2018 20:20:02 +0200 + +ocaml-duppy (0.5.1-1) unstable; urgency=low + + * New upstream release. + + -- Romain Beauxis Wed, 08 May 2013 18:55:54 -0500 + +ocaml-duppy (0.5.0-1) experimental; urgency=low + + * New upstream release. + * Upload to experimental. + * Bumped standards version to 3.9.4 + + -- Romain Beauxis Mon, 15 Apr 2013 22:31:34 -0500 + +ocaml-duppy (0.4.2-1) unstable; urgency=low + + * New upstream release. + + -- Romain Beauxis Sat, 08 Oct 2011 16:36:11 +0200 + +ocaml-duppy (0.4.1-1) unstable; urgency=low + + * New upstream release. + + -- Romain Beauxis Thu, 04 Aug 2011 21:50:44 -0500 + +ocaml-duppy (0.4.0-1) unstable; urgency=low + + * Uploading upstream 0.4.0 release to unstable. + + -- Romain Beauxis Sun, 26 Jun 2011 19:54:28 -0500 + +ocaml-duppy (0.4.0~20110523+hg644dd3b27614-1) experimental; urgency=low + + * Snapshot from mercurial repository. + + -- Romain Beauxis Mon, 23 May 2011 15:18:45 -0500 + +ocaml-duppy (0.3.2-2) unstable; urgency=low + + * Upload to unstable. + + -- Romain Beauxis Thu, 03 Mar 2011 13:30:12 -0600 + +ocaml-duppy (0.3.2-1) experimental; urgency=low + + * New upstream release. + * Bumped standards version to 3.9.1 + * Upload to experimental now that squeeze is frozen. + + -- Romain Beauxis Thu, 19 Aug 2010 13:43:19 -0500 + +ocaml-duppy (0.3.1-1) unstable; urgency=low + + * New upstream release. + * Bumped standards version to 3.8.3 + * Use new automatic dependency system. + * Added doc-base registration. + + -- Romain Beauxis Wed, 14 Oct 2009 17:41:30 -0500 + +ocaml-duppy (0.3.0-1) unstable; urgency=low + + * New Upstream Version + * Changed section to ocaml. + * Bumped standards version to 3.8.2.0. + * Enable debugging. + + -- Romain Beauxis Thu, 18 Jun 2009 18:22:52 +0200 + +ocaml-duppy (0.2.0-2) unstable; urgency=low + + * Tighten build-dependency on ocaml-pcre. + + -- Samuel Mimram Fri, 27 Feb 2009 09:36:10 +0100 + +ocaml-duppy (0.2.0-1) unstable; urgency=low + + * New Upstream Version. + * Switch packaging to git. + * Use dh-ocaml's predefined variables. + * Update compat to 7. + + -- Samuel Mimram Wed, 25 Feb 2009 18:08:09 +0100 + +ocaml-duppy (0.1.2-1) unstable; urgency=low + + * New upstream release + * Updated standards to 3.8.0 + * Changed maintainer to Debian OCaml Maintainers + * Added libpcre-ocaml-dev to binary dependencies + + -- Romain Beauxis Wed, 25 Jun 2008 15:25:37 +0200 + +ocaml-duppy (0.1.1-1) unstable; urgency=low + + * New upstream release, now installs .cmx file + * Changed maintainer to Debian OCaml Maintainers + + -- Romain Beauxis Tue, 15 Apr 2008 17:40:51 +0100 + +ocaml-duppy (0.1.0-4) unstable; urgency=low + + * Really fix dh_install call + + -- Romain Beauxis Sun, 06 Apr 2008 15:17:43 +0100 + +ocaml-duppy (0.1.0-3) unstable; urgency=low + + * Fixed FTBFS on non native archs due to missing installed files. + + -- Romain Beauxis Thu, 03 Apr 2008 11:03:03 +0100 + +ocaml-duppy (0.1.0-2) unstable; urgency=low + + * Fixed debian/copyright + * Fixed typos in debian/control + + -- Romain Beauxis Thu, 03 Apr 2008 10:09:44 +0100 + +ocaml-duppy (0.1.0-1) unstable; urgency=low + + * Initial release and upload to unstable + Closes: #471053 + + -- Romain Beauxis Sun, 23 Mar 2008 12:57:20 +0100 diff --git a/control b/control new file mode 100644 index 0000000..450acbb --- /dev/null +++ b/control @@ -0,0 +1,45 @@ +Source: ocaml-duppy +Section: ocaml +Priority: optional +Maintainer: Debian OCaml Maintainers +Uploaders: Kyle Robbertze +Build-Depends: debhelper-compat (= 13), + dh-buildinfo, + dh-ocaml, + libpcre-ocaml-dev, + ocaml-dune, + ocaml-nox +Standards-Version: 4.6.1 +Rules-Requires-Root: no +Homepage: https://savonet.sourceforge.net/ +Vcs-Git: https://salsa.debian.org/ocaml-team/ocaml-duppy.git +Vcs-Browser: https://salsa.debian.org/ocaml-team/ocaml-duppy + +Package: libduppy-ocaml +Architecture: any +Depends: ${misc:Depends}, ${ocaml:Depends}, ${shlibs:Depends} +Provides: ${ocaml:Provides} +Description: Advanced scheduler for OCaml (Runtime library) + Duppy is an event scheduler written for OCaml. It allows the user + to execute tasks according to some events on unix sockets, or + a given delay. + . + Several threaded queues can proceed tasks in parallel. Tasks are + processed according to an abstract notion of priority. + . + This package contains only the shared runtime stub libraries. + +Package: libduppy-ocaml-dev +Architecture: any +Depends: ocaml-findlib, ${misc:Depends}, ${ocaml:Depends}, ${shlibs:Depends} +Provides: ${ocaml:Provides} +Description: Advanced scheduler for OCaml (Development package) + Duppy is an event scheduler written for OCaml. It allows the user + to execute tasks according to some events on unix sockets, or + a given delay. + . + Several threaded queues can proceed tasks in parallel. Tasks are + processed according to an abstract notion of priority. + . + This package contains all the development stuff you need to use ocaml-duppy + in your programs. diff --git a/copyright b/copyright new file mode 100644 index 0000000..096c412 --- /dev/null +++ b/copyright @@ -0,0 +1,51 @@ +Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/ +Upstream-Name: ocaml-duppy +Source: https://github.com/savonet/ocaml-duppy + +Files: * +Copyright: 2003-2010 Savonet Team +License: LGPL-2.1+ + +Files: src/* +Copyright: 2003-2010 Savonet Team +License: GPL-2+ + +Files: debian/* +Copyright: 2008 Romain Beauxis + 2018 Kyle Robbertze +License: GPL-2+ + +License: LGPL-2.1+ + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as + published by the Free Software Foundation, with linking exceptions; + either version 2.1 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 + Lesser General Public License for more details. + . + You should have received a copy of the GNU Lesser General Public + License along with this program; if not, see . + . + On Debian systems, the complete text of the GNU Lesser General + Public License version 2.1 can be found in "/usr/share/common-licenses/LGPL-2.1". + +License: GPL-2+ + 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 of the License, or + (at your option) any later version. + . + This package 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 . + . + On Debian systems, the complete text of the GNU General + Public License version 2 can be found in "/usr/share/common-licenses/GPL-2". diff --git a/gbp.conf b/gbp.conf new file mode 100644 index 0000000..cec628c --- /dev/null +++ b/gbp.conf @@ -0,0 +1,2 @@ +[DEFAULT] +pristine-tar = True diff --git a/libduppy-ocaml-dev.docs b/libduppy-ocaml-dev.docs new file mode 100644 index 0000000..a7a328f --- /dev/null +++ b/libduppy-ocaml-dev.docs @@ -0,0 +1 @@ +usr/doc/*/* diff --git a/libduppy-ocaml-dev.install.in b/libduppy-ocaml-dev.install.in new file mode 100644 index 0000000..5392a44 --- /dev/null +++ b/libduppy-ocaml-dev.install.in @@ -0,0 +1,6 @@ +@OCamlStdlibDir@/duppy/*dune* +@OCamlStdlibDir@/duppy/*opam* +@OCamlStdlibDir@/duppy/META +@OCamlStdlibDir@/duppy/*.a +@OCamlStdlibDir@/duppy/*.cm* +@OCamlStdlibDir@/duppy/*.ml* diff --git a/libduppy-ocaml.install.in b/libduppy-ocaml.install.in new file mode 100644 index 0000000..fcb9a2c --- /dev/null +++ b/libduppy-ocaml.install.in @@ -0,0 +1 @@ +@OCamlDllDir@/dll*.so diff --git a/rules b/rules new file mode 100755 index 0000000..1a513c2 --- /dev/null +++ b/rules @@ -0,0 +1,15 @@ +#!/usr/bin/make -f +# -*- makefile -*- + +include /usr/share/ocaml/ocamlvars.mk + +DESTDIR=$(CURDIR)/debian/tmp + +%: + dh $@ --with ocaml + +override_dh_auto_build: + dune build -p duppy + +override_dh_auto_install: + dune install --destdir=$(DESTDIR) --prefix=/usr --libdir=..$(OCAML_STDLIB_DIR) diff --git a/source/format b/source/format new file mode 100644 index 0000000..163aaf8 --- /dev/null +++ b/source/format @@ -0,0 +1 @@ +3.0 (quilt) diff --git a/upstream/metadata b/upstream/metadata new file mode 100644 index 0000000..f9fd843 --- /dev/null +++ b/upstream/metadata @@ -0,0 +1,5 @@ +--- +Bug-Database: https://github.com/savonet/ocaml-duppy/issues +Bug-Submit: https://github.com/savonet/ocaml-duppy/issues/new +Repository: https://github.com/savonet/ocaml-duppy.git +Repository-Browse: https://github.com/savonet/ocaml-duppy diff --git a/watch b/watch new file mode 100644 index 0000000..cc1a0cd --- /dev/null +++ b/watch @@ -0,0 +1,2 @@ +version=4 +https://github.com/savonet/ocaml-duppy/tags .*/v?([0-9.]+)\.tar\.gz -- cgit v1.2.3