Added an example with a configure step
This commit is contained in:
parent
a07df550e0
commit
5e6481f3a9
|
@ -0,0 +1,36 @@
|
|||
This project shows how to add a configure step to a project using
|
||||
jbuilder.
|
||||
|
||||
In order to keep things composable, it offers several way to configure
|
||||
the project:
|
||||
|
||||
1. with the classic =./configure <args...>=. When doing this, the configuration
|
||||
script are run immediately and the resulting configuration is frozen for the
|
||||
rest of the build
|
||||
|
||||
2. by copying =config.defaults= to =config= and editing it. The
|
||||
configuration scripts will be run as part of the build using what
|
||||
is written in =config=. When =config= is edited, the configuration
|
||||
scripts will be automatically re-run
|
||||
|
||||
3. by doing nothing. The configuration scripts will be run as part of the build
|
||||
using the default values provided in =config.defaults=
|
||||
|
||||
Technically this is how it works:
|
||||
|
||||
=configure= is a simple OCaml script that:
|
||||
- parses the command line
|
||||
- generates a =config= file using what was given on the command line
|
||||
- calls =ocaml real_configure.ml=
|
||||
- =real_configure.ml= does some stuff and generates =config.full=
|
||||
|
||||
=config.full= is what is used by the rest of the build.
|
||||
|
||||
Now in order to support (2) and (3), we setup the following rules in
|
||||
the toplevel =jbuild=:
|
||||
- a rule to procude =config= by copying =config.default=
|
||||
- a rule to produce =config.full= by running =real_configure.ml=
|
||||
|
||||
The reason it all work as described is because if Jbuilder knows how
|
||||
to build a file and this file is already present in the source tree,
|
||||
it will always prefer the file that's already there
|
|
@ -0,0 +1,7 @@
|
|||
(* -*- tuareg -*- *)
|
||||
|
||||
(* Default configuration, copy this file to "config" and edit it to change the build
|
||||
configuration. Alternatively call ./configure *)
|
||||
|
||||
(* Enable support for blah *)
|
||||
let enable_blah = Auto
|
|
@ -0,0 +1,11 @@
|
|||
(* Various types used by configure and real_configure.ml *)
|
||||
|
||||
type switch =
|
||||
| Yes
|
||||
| No
|
||||
| Auto
|
||||
|
||||
let string_of_switch = function
|
||||
| Yes -> "Yes"
|
||||
| No -> "No"
|
||||
| Auto -> "Auto"
|
|
@ -0,0 +1,27 @@
|
|||
#!/usr/bin/env ocaml
|
||||
(* -*- tuareg -*- *)
|
||||
|
||||
#warnings "-40";;
|
||||
|
||||
#use "config_common.ml"
|
||||
|
||||
let () =
|
||||
let enable_blah = ref Auto in
|
||||
Arg.parse
|
||||
(Arg.align
|
||||
[ "--enable-blah", Unit (fun () -> enable_blah := Yes),
|
||||
" Enable support for blah"
|
||||
; "--disable-blah", Unit (fun () -> enable_blah := No),
|
||||
" Enable support for blah"
|
||||
])
|
||||
(fun s -> raise (Arg.Bad (Printf.sprintf "don't know what to do with %S" s)))
|
||||
"Usage: ./configure [OPTIONS]";
|
||||
let oc = open_out_bin "config" in
|
||||
Printf.fprintf oc {|
|
||||
let enable_blah = %s
|
||||
|}
|
||||
(string_of_switch !enable_blah);
|
||||
close_out oc
|
||||
;;
|
||||
|
||||
#use "real_configure.ml"
|
|
@ -0,0 +1,11 @@
|
|||
(jbuild_version 1)
|
||||
|
||||
(rule
|
||||
((targets (config))
|
||||
(deps (config.defaults))
|
||||
(action (copy ${<} ${@}))))
|
||||
|
||||
(rule
|
||||
((targets (config.full))
|
||||
(deps (config_common.ml config))
|
||||
(action (run ${OCAML} ${path:real_configure.ml}))))
|
|
@ -0,0 +1,11 @@
|
|||
opam-version: "1.2"
|
||||
version: "1.0"
|
||||
maintainer: "bob@sponge.com"
|
||||
authors: ["SpongeBob"]
|
||||
homepage: "https://github.com/SpongeBob/myproject"
|
||||
bug-reports: "https://github.com/SpongeCob/myproject/issues"
|
||||
dev-repo: "https://github.com/SpongeBob/myproject.git"
|
||||
license: "Apache-2.0"
|
||||
build: [
|
||||
["jbuilder" "build" "--only" "myproject" "--root" "." "-j" jobs "@install"]
|
||||
]
|
|
@ -0,0 +1,24 @@
|
|||
#use "config_common.ml"
|
||||
#use "config"
|
||||
|
||||
let with_blah =
|
||||
match enable_blah with
|
||||
| Yes -> true
|
||||
| No -> false
|
||||
| Auto -> true (* replace by some detection code *)
|
||||
|
||||
let blah_path =
|
||||
if with_blah then
|
||||
(* replace by some relevant stuff *)
|
||||
"/path/to/blah"
|
||||
else
|
||||
"<no support for blah>"
|
||||
|
||||
let () =
|
||||
let oc = open_out_bin "config.full" in
|
||||
Printf.fprintf oc {|
|
||||
let with_blah = %B
|
||||
let blah_path = %S
|
||||
|}
|
||||
with_blah blah_path
|
||||
|
|
@ -0,0 +1,14 @@
|
|||
(jbuild_version 1)
|
||||
|
||||
(executables
|
||||
((names (plop))))
|
||||
|
||||
(install
|
||||
((section bin)
|
||||
(files ((plop.exe as plop)))))
|
||||
|
||||
(rule
|
||||
((targets (config.ml))
|
||||
(deps (../config.full))
|
||||
(action (copy ${<} ${@}))))
|
||||
|
|
@ -0,0 +1,5 @@
|
|||
let () =
|
||||
Printf.printf "Built with support for blah: %B\n\
|
||||
Path to blah is: %S\n"
|
||||
Config.with_blah
|
||||
Config.blah_path
|
Loading…
Reference in New Issue