annotate src/settings.sig @ 1739:c414850f206f

Add support for -boot flag, which allows in-tree execution of Ur/Web The boot flag rewrites most hardcoded paths to point to the build directory, and also forces static compilation. This is convenient for developing Ur/Web, or if you cannot 'sudo make install' Ur/Web. The following changes were made: * Header files were moved to include/urweb instead of include; this lets FFI users point their C_INCLUDE_PATH at this directory at write <urweb/urweb.h>. For internal Ur/Web executables, we simply pass -I$PATH/include/urweb as normal. * Differentiate between LIB and SRCLIB; SRCLIB is Ur and JavaScript source files, while LIB is compiled products from libtool. For in-tree compilation these live in different places. * No longer reference Config for paths; instead use Settings; these settings can be changed dynamically by Compiler.enableBoot () (TODO: add a disableBoot function.) * config.h is now generated directly in include/urweb/config.h, for consistency's sake (especially since it gets installed along with the rest of the headers!) * All of the autotools build products got updated. * The linkStatic field in protocols now only contains the name of the build product, and not the absolute path. Future users have to be careful not to reference the Settings files to early, lest they get an old version (this was the source of two bugs during development of this patch.)
author Edward Z. Yang <ezyang@mit.edu>
date Wed, 02 May 2012 17:17:57 -0400
parents ac141fbb313a
children 675ce534e3ec
rev   line source
adam@1478 1 (* Copyright (c) 2008-2011, Adam Chlipala
adamc@764 2 * All rights reserved.
adamc@764 3 *
adamc@764 4 * Redistribution and use in source and binary forms, with or without
adamc@764 5 * modification, are permitted provided that the following conditions are met:
adamc@764 6 *
adamc@764 7 * - Redistributions of source code must retain the above copyright notice,
adamc@764 8 * this list of conditions and the following disclaimer.
adamc@764 9 * - Redistributions in binary form must reproduce the above copyright notice,
adamc@764 10 * this list of conditions and the following disclaimer in the documentation
adamc@764 11 * and/or other materials provided with the distribution.
adamc@764 12 * - The names of contributors may not be used to endorse or promote products
adamc@764 13 * derived from this software without specific prior written permission.
adamc@764 14 *
adamc@764 15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
adamc@764 16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
adamc@764 17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
adamc@764 18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
adam@1682 19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
adamc@764 20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
adamc@764 21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
adamc@764 22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
adamc@764 23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
adamc@764 24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
adamc@764 25 * POSSIBILITY OF SUCH DAMAGE.
adamc@764 26 *)
adamc@764 27
adamc@764 28 signature SETTINGS = sig
adam@1682 29
ezyang@1739 30 (* XXX these should be unit -> string too *)
ezyang@1739 31 val configBin : string ref
ezyang@1739 32 val configLib : string ref
ezyang@1739 33 val configSrcLib : string ref
ezyang@1739 34 val configInclude : string ref
ezyang@1739 35 val configSitelisp : string ref
ezyang@1739 36
ezyang@1739 37 val libUr : unit -> string
ezyang@1739 38 val libC : unit -> string
ezyang@1739 39 val libJs : unit -> string
ezyang@1739 40
adamc@866 41 val setDebug : bool -> unit
adamc@866 42 val getDebug : unit -> bool
adam@1682 43
ezyang@1739 44 val libFile : string -> string
adamc@866 45 val clibFile : string -> string
adamc@866 46
adamc@765 47 (* How do all application URLs begin? *)
adamc@764 48 val setUrlPrefix : string -> unit
adamc@764 49 val getUrlPrefix : unit -> string
adam@1370 50 val getUrlPrePrefix : unit -> string
adam@1637 51 val getUrlPrefixFull : unit -> string
adam@1637 52 (* The full prefix is the value that was set explicitly, while the "pre"
adam@1637 53 * prefix gets the protocol/host/port part and the unqualified prefix gets
adam@1637 54 * the URI. *)
adamc@764 55
adamc@765 56 (* How many seconds should the server wait before assuming a Comet client has left? *)
adamc@764 57 val setTimeout : int -> unit
adamc@764 58 val getTimeout : unit -> int
adamc@764 59
adamc@765 60 (* Which C header files are needed? *)
adamc@764 61 val setHeaders : string list -> unit
adamc@764 62 val getHeaders : unit -> string list
adamc@764 63
adamc@766 64 (* Which extra JavaScript URLs should be included? *)
adamc@766 65 val setScripts : string list -> unit
adamc@766 66 val getScripts : unit -> string list
adamc@766 67
adamc@765 68 type ffi = string * string
adamc@765 69
adamc@765 70 (* Which FFI types may be sent from clients to servers? *)
adamc@765 71 val setClientToServer : ffi list -> unit
adamc@765 72 val mayClientToServer : ffi -> bool
adamc@765 73
adamc@765 74 (* Which FFI functions have side effects? *)
adamc@765 75 val setEffectful : ffi list -> unit
adamc@765 76 val isEffectful : ffi -> bool
adamc@765 77
adamc@1171 78 (* Which FFI functions should not have their calls removed or reordered, but cause no lasting effects? *)
adamc@1171 79 val setBenignEffectful : ffi list -> unit
adamc@1171 80 val isBenignEffectful : ffi -> bool
adamc@1171 81
adamc@765 82 (* Which FFI functions may only be run in clients? *)
adamc@765 83 val setClientOnly : ffi list -> unit
adamc@765 84 val isClientOnly : ffi -> bool
adamc@765 85
adamc@765 86 (* Which FFI functions may only be run on servers? *)
adamc@765 87 val setServerOnly : ffi list -> unit
adamc@765 88 val isServerOnly : ffi -> bool
adamc@765 89
adamc@765 90 (* Which FFI functions may be run in JavaScript? (JavaScript function names included) *)
adamc@765 91 val setJsFuncs : (ffi * string) list -> unit
adamc@765 92 val jsFunc : ffi -> string option
adam@1433 93 val allJsFuncs : unit -> (ffi * string) list
adamc@765 94
adamc@768 95 datatype pattern_kind = Exact | Prefix
adamc@768 96 datatype action = Allow | Deny
adamc@768 97 type rule = { action : action, kind : pattern_kind, pattern : string }
adamc@768 98
adamc@768 99 datatype path_kind = Any | Url | Table | Sequence | View | Relation | Cookie | Style
adamc@768 100 type rewrite = { pkind : path_kind, kind : pattern_kind, from : string, to : string }
adamc@768 101
adamc@768 102 (* Rules for rewriting URLs from canonical forms *)
adamc@768 103 val setRewriteRules : rewrite list -> unit
adamc@768 104 val rewrite : path_kind -> string -> string
adamc@768 105
adamc@769 106 (* Validating URLs and MIME types *)
adamc@769 107 val setUrlRules : rule list -> unit
adamc@770 108 val getUrlRules : unit -> rule list
adamc@769 109 val checkUrl : string -> bool
adamc@769 110
adamc@769 111 val setMimeRules : rule list -> unit
adamc@770 112 val getMimeRules : unit -> rule list
adamc@769 113 val checkMime : string -> bool
adamc@769 114
adam@1465 115 val setRequestHeaderRules : rule list -> unit
adam@1465 116 val getRequestHeaderRules : unit -> rule list
adam@1465 117 val checkRequestHeader : string -> bool
adam@1465 118
adam@1465 119 val setResponseHeaderRules : rule list -> unit
adam@1465 120 val getResponseHeaderRules : unit -> rule list
adam@1465 121 val checkResponseHeader : string -> bool
adam@1465 122
adamc@855 123 (* Web protocols that generated programs may speak *)
adamc@855 124 type protocol = {
adamc@1095 125 name : string, (* Call it this on the command line *)
adamc@1096 126 compile : string, (* Pass these `gcc -c' arguments *)
adamc@1095 127 linkStatic : string, (* Pass these static linker arguments *)
adamc@1095 128 linkDynamic : string,(* Pass these dynamic linker arguments *)
adamc@1164 129 persistent : bool, (* Multiple requests per process? *)
adamc@1164 130 code : unit -> Print.PD.pp_desc (* Extra code to include in C files *)
adamc@855 131 }
adamc@855 132 val addProtocol : protocol -> unit
adamc@856 133 val setProtocol : string -> unit
adamc@855 134 val currentProtocol : unit -> protocol
adamc@855 135
adamc@866 136 (* Different DBMSes *)
adamc@867 137 datatype sql_type =
adamc@867 138 Int
adamc@867 139 | Float
adamc@867 140 | String
adamc@1011 141 | Char
adamc@867 142 | Bool
adamc@867 143 | Time
adamc@867 144 | Blob
adamc@867 145 | Channel
adamc@867 146 | Client
adamc@867 147 | Nullable of sql_type
adamc@867 148
adamc@873 149 val p_sql_ctype : sql_type -> string
adamc@867 150 val isBlob : sql_type -> bool
adamc@870 151 val isNotNull : sql_type -> bool
adamc@867 152
adam@1293 153 datatype failure_mode = Error | None
adam@1293 154
adamc@866 155 type dbms = {
adamc@866 156 name : string,
adamc@866 157 (* Call it this on the command line *)
adam@1682 158 randomFunction : string,
adam@1682 159 (* DBMS's name for random number-generating function *)
adamc@866 160 header : string,
adamc@866 161 (* Include this C header file *)
adamc@866 162 link : string,
adamc@866 163 (* Pass these linker arguments *)
adamc@873 164 p_sql_type : sql_type -> string,
adamc@870 165 init : {dbstring : string,
adamc@870 166 prepared : (string * int) list,
adamc@870 167 tables : (string * (string * sql_type) list) list,
adamc@872 168 views : (string * (string * sql_type) list) list,
adamc@870 169 sequences : string list} -> Print.PD.pp_desc,
adamc@874 170 (* Define uw_client_init(), uw_db_init(), uw_db_close(), uw_db_begin(), uw_db_commit(), and uw_db_rollback() *)
adamc@873 171 query : {loc : ErrorMsg.span, cols : sql_type list,
adamc@880 172 doCols : ({loc : ErrorMsg.span, wontLeakStrings : bool, col : int, typ : sql_type} -> Print.PD.pp_desc)
adamc@867 173 -> Print.PD.pp_desc}
adamc@867 174 -> Print.PD.pp_desc,
adamc@867 175 queryPrepared : {loc : ErrorMsg.span, id : int, query : string,
adamc@873 176 inputs : sql_type list, cols : sql_type list,
adamc@880 177 doCols : ({loc : ErrorMsg.span, wontLeakStrings : bool, col : int,
adamc@880 178 typ : sql_type} -> Print.PD.pp_desc)
adamc@879 179 -> Print.PD.pp_desc,
adamc@879 180 nested : bool}
adamc@868 181 -> Print.PD.pp_desc,
adam@1293 182 dml : ErrorMsg.span * failure_mode -> Print.PD.pp_desc,
adamc@868 183 dmlPrepared : {loc : ErrorMsg.span, id : int, dml : string,
adam@1293 184 inputs : sql_type list, mode : failure_mode} -> Print.PD.pp_desc,
adamc@878 185 nextval : {loc : ErrorMsg.span, seqE : Print.PD.pp_desc, seqName : string option} -> Print.PD.pp_desc,
adamc@874 186 nextvalPrepared : {loc : ErrorMsg.span, id : int, query : string} -> Print.PD.pp_desc,
adamc@1073 187 setval : {loc : ErrorMsg.span, seqE : Print.PD.pp_desc, count : Print.PD.pp_desc} -> Print.PD.pp_desc,
adamc@874 188 sqlifyString : string -> string,
adamc@874 189 p_cast : string * sql_type -> string,
adamc@874 190 p_blank : int * sql_type -> string (* Prepared statement input *),
adamc@877 191 supportsDeleteAs : bool,
adamc@886 192 supportsUpdateAs : bool,
adamc@877 193 createSequence : string -> string,
adamc@878 194 textKeysNeedLengths : bool,
adamc@879 195 supportsNextval : bool,
adamc@882 196 supportsNestedPrepared : bool,
adamc@890 197 sqlPrefix : string,
adamc@1014 198 supportsOctetLength : bool,
adamc@1014 199 trueString : string,
adamc@1196 200 falseString : string,
adamc@1196 201 onlyUnion : bool,
adamc@1196 202 nestedRelops : bool
adamc@866 203 }
adamc@857 204
adamc@866 205 val addDbms : dbms -> unit
adamc@866 206 val setDbms : string -> unit
adamc@866 207 val currentDbms : unit -> dbms
adamc@858 208
adamc@891 209 val setDbstring : string option -> unit
adamc@891 210 val getDbstring : unit -> string option
adamc@891 211
adamc@891 212 val setExe : string option -> unit
adamc@891 213 val getExe : unit -> string option
adamc@891 214
adamc@891 215 val setSql : string option -> unit
adamc@891 216 val getSql : unit -> string option
adamc@891 217
adamc@1016 218 val setCoreInline : int -> unit
adamc@1016 219 val getCoreInline : unit -> int
adamc@1016 220
adamc@1016 221 val setMonoInline : int -> unit
adamc@1016 222 val getMonoInline : unit -> int
adamc@1016 223
adamc@1095 224 val setStaticLinking : bool -> unit
adamc@1095 225 val getStaticLinking : unit -> bool
adamc@1095 226
adamc@1114 227 val setDeadlines : bool -> unit
adamc@1114 228 val getDeadlines : unit -> bool
adamc@1114 229
adamc@1164 230 val setSigFile : string option -> unit
adamc@1164 231 val getSigFile : unit -> string option
adamc@1164 232
adamc@1183 233 (* Which GET-able functions should be allowed to have side effects? *)
adamc@1183 234 val setSafeGets : string list -> unit
adamc@1183 235 val isSafeGet : string -> bool
adamc@1183 236
adam@1294 237 val setOnError : (string * string list * string) option -> unit
adam@1294 238 val getOnError : unit -> (string * string list * string) option
adam@1307 239
adam@1307 240 val addLimit : string * int -> unit
adam@1307 241 val limits : unit -> (string * int) list
adam@1332 242
adam@1332 243 val setMinHeap : int -> unit
adam@1332 244 val getMinHeap : unit -> int
adam@1393 245
adam@1393 246 val addAlwaysInline : string -> unit
adam@1393 247 val checkAlwaysInline : string -> bool
adam@1478 248
adam@1478 249 val addNoXsrfProtection : string -> unit
adam@1478 250 val checkNoXsrfProtection : string -> bool
adam@1629 251
adam@1629 252 val setTimeFormat : string -> unit
adam@1629 253 val getTimeFormat : unit -> string
adamc@764 254 end