let o_file = change_file_extension "o" c_file in
target (more_recent [o_file] [c_file]);
- sh "cc -c %s -o %s" c_file o_file
+ sh "cd $builddir && cc -c %s -o %s" c_file o_file
}
In the second example, the rule requires that several files
require (compiled source);
let object = change_file_extension "o" source in
- sh "cc %s -o %s" object program
+ sh "cd $builddir && cc %s -o %s" object program
}
*)
val file_newer_than : string -> string -> bool
(** [file_newer_than file_a file_b] returns true if [file_a] is
newer than [file_b]. Note that if [file_a] does not exist, it
- returns false. If [file_b] does not exist, it is an error. *)
+ returns false. If [file_b] does not exist, it is an error.
+
+ There is also a goal version of this function. *)
val more_recent : string list -> string list -> bool
(** [more_recent objects sources] expresses the [make] relationship:
Note that both parameters are lists (since in [make] you can
have a list of source files and a list of object files). If you
don't want a list, pass a single-element list containing the
- single the object/source file. *)
+ single the object/source file.
+
+ There is also a goal version of this function. *)
val url_exists : string -> bool
(** The URL is tested to see if it exists.
- This function also exists as a goal. Writing:
- {v require (url_exists "http://example.com");}
- will die unless the given URL exists. *)
+ There is also a goal version of this function. *)
+
+val file_contains_string : string -> string -> bool
+ (** [file_contains_string filename str] checks if the named file
+ contains the given substring [str].
+
+ There is also a goal version of this function. *)
+
+val url_contains_string : string -> string -> bool
+ (** [url_contains_string url str] downloads the URL and checks
+ whether the content contains the given substring [str].
+
+ There is also a goal version of this function. *)
+
+val (//) : string -> string -> string
+ (** Concatenate two paths. *)
+
+val quote : string -> string
+ (** Quote the string to make it safe to pass directly to the shell. *)
(** {2 Shell}
{v command ||: }
to ignore the result of a command.
- Each shell runs in a new temporary directory. The temporary directory
- and all its contents is deleted after the shell exits. If you
- want to save any data, [cd] somewhere. For example you could start
- the command sequence with:
- {v cd $HOME/data/ }
+ Each shell runs in a new temporary directory. The temporary
+ directory and all its contents is deleted after the shell exits.
+ If you want to save any data, [cd] somewhere. The environment
+ variable [$builddir] is exported to the script. This is the
+ current directory when the goaljobs program was started.
+
+ For example you could start the command sequence with
+ [cd $HOME/data/] or [cd $builddir].
*)
val sh : ('a, unit, string, unit) format4 -> 'a
Any lines printed to stdout is returned as a list of strings.
Trailing [\n] characters are not returned. *)
-(*
val shell : string ref
(** Set this variable to override the default shell ([/bin/sh]). *)
-*)
(** {2 String functions}
val goal_file_newer_than : string -> string -> unit
val goal_more_recent : string list -> string list -> unit
val goal_url_exists : string -> unit
+val goal_file_contains_string : string -> string -> unit
+val goal_url_contains_string : string -> string -> unit
val goal_memory_exists : string -> unit
(* A single call to this function is added by the 'goaljobs' script.