alloca doesn't set errno, so it's pointless to call strerror when it fails
[apc.git] / build.ml
blob003e2f3a67dc4a2e4534d45943971d845885665e
1 open List;;
2 open Typs;;
3 open Utils;;
4 open State;;
5 open Helpers;;
7 let jobs, targets, dodeplist, dotarlist = getopt ();;
9 let srcdir =
10 match getval "src" with
11 | None -> failwith "no source dir"
12 | Some s -> s
15 let _ =
16 cmo "-g -I +lablGL -thread" [srcdir] srcdir "apc";
17 ocaml
18 "-ccopt '-Wall -o ml_apc.o'"
19 "ml_apc.o"
20 (StrSet.singleton "ml_apc.o")
21 [Filename.concat srcdir "ml_apc.c"]
22 StrSet.empty
24 let prog base =
25 gcc "gcc" true
26 "-Wall -Werror -g -c" ""
27 (base ^ ".o")
28 [Filename.concat srcdir (base ^ ".c")]
30 gcc "gcc" false
31 "" ""
32 base
33 [base ^ ".o"]
36 prog "hog";
37 prog "idlestat";
38 ocaml
39 "-custom -thread -g -I +lablGL lablgl.cma lablglut.cma unix.cma threads.cma"
40 "apc"
41 (StrSet.singleton "apc")
42 ["ml_apc.o"; "apc.cmo"]
43 StrSet.empty
45 let _ =
46 let moddir = Filename.concat srcdir "mod" in
47 let modconts = Sys.readdir moddir in
48 let deps = Array.fold_left (fun deps s ->
49 if String.length s > 0 && s.[0] != '.'
50 then
51 let src = Filename.concat moddir s in
52 add_target s (StrSet.singleton src) (StrSet.singleton s) (StrSet.singleton src);
53 let build _ =
54 let c = [Run ("cp " ^ Filename.quote src ^ " " ^ Filename.quote s)] in
55 c, c, "COPY"
57 State.put_build_info s build;
58 StrSet.add s deps
59 else
60 deps
61 ) StrSet.empty modconts
63 let build _ =
64 let c = [Run ("make")] in
65 c, c, "KBUILD"
67 add_phony "mod" deps [];
68 State.put_build_info "mod" build;
73 let () =
74 let start = Unix.gettimeofday () in
75 Scan.all targets;
76 if dodeplist
77 then
78 List.iter State.print_deps targets
79 else
80 begin
81 let build path =
82 let built = Unix.handle_unix_error Build.path path in
83 if not !Config.silent
84 then
85 if built
86 then print_endline (path ^ " has been built")
87 else print_endline ("nothing to be done for " ^ path)
90 if jobs = 1
91 then
92 iter build targets
93 else
94 let rec loop i tids = if i = jobs then tids else
95 let tid = Thread.create (fun () -> iter build targets) () in
96 loop (succ i) (tid :: tids)
98 let tids = loop 0 [] in
99 iter Thread.join tids
102 Cache.save !State.Config.cache;
103 let stop = Unix.gettimeofday () in
104 Format.eprintf "build took %f seconds@." (stop -. start);