Project

General

Profile

Statistics
| Branch: | Tag: | Revision:

lustrec / src / backends / C / c_backend_makefile.ml @ 01c7d5e1

History | View | Annotate | Download (2.56 KB)

1
open Format
2
open LustreSpec
3
open Corelang
4

    
5
let header_has_code header =
6
  List.exists 
7
    (fun top -> 
8
      match top.top_decl_desc with
9
      | Consts _ -> true 
10
      | ImportedNode nd -> nd.nodei_in_lib = None
11
      | _ -> false
12
    )
13
    header
14

    
15
let header_libs header =
16
  List.fold_left (fun accu top ->
17
    match top.top_decl_desc with
18
      | ImportedNode nd -> (match nd.nodei_in_lib with 
19
	| None -> accu 
20
	| Some lib -> Utils.list_union [lib] accu)
21
      | _ -> accu 
22
  ) [] header 
23
    
24

    
25
let compiled_dependencies dep = 
26
  List.filter (fun (_, _, header) -> header_has_code header) dep
27

    
28
let lib_dependencies dep = 
29
  List.fold_left 
30
    (fun accu (_, _, header) -> Utils.list_union (header_libs header) accu) [] dep
31
    
32
let fprintf_dependencies fmt dep =
33
  let compiled_dep = compiled_dependencies dep in
34
  List.iter (fun s -> (* Format.eprintf "Adding dependency: %s@." s;  *)
35
    fprintf fmt "\t${GCC} -I${INC} -c %s@." s)
36
    (("${INC}/io_frontend.c"):: (* IO functions when a main function is computed *)
37
	(List.map 
38
	   (fun (s, local, _) -> 
39
	     (if local then s else Version.prefix ^ "/include/lustrec/" ^ s) ^ ".c")
40
	   compiled_dep))
41

    
42
module type MODIFIERS_MKF =
43
sig
44
  val other_targets: Format.formatter -> string -> string -> (string * bool * top_decl list) list -> unit
45
end
46

    
47
module EmptyMod =
48
struct
49
  let other_targets _ _ _ _ = ()
50
end
51

    
52
module Main = functor (Mod: MODIFIERS_MKF) -> 
53
struct
54

    
55

    
56
let print_makefile basename nodename dependencies fmt =
57
  fprintf fmt "GCC=gcc@.";
58
  fprintf fmt "LUSTREC=%s@." Sys.executable_name;
59
  fprintf fmt "LUSTREC_BASE=%s@." (Filename.dirname (Filename.dirname Sys.executable_name));
60
  fprintf fmt "INC=${LUSTREC_BASE}/include/lustrec@.";
61
  fprintf fmt "@.";
62

    
63
  (* Main binary *)
64
  fprintf fmt "%s_%s:@." basename nodename;
65
  fprintf fmt "\t${GCC} -I${INC} -I. -c %s.c@." basename;  
66
  fprintf fmt "\t${GCC} -I${INC} -I. -c %s_main.c@." basename;   
67
  fprintf_dependencies fmt dependencies;    
68
  fprintf fmt "\t${GCC} -o %s_%s io_frontend.o %a %s.o %s_main.o %a@." basename nodename 
69
    (Utils.fprintf_list ~sep:" " (fun fmt (s, _, _) -> Format.fprintf fmt "%s.o" s)) (compiled_dependencies dependencies)
70
    basename (* library .o *)
71
    basename (* main function . o *) 
72
    (Utils.fprintf_list ~sep:" " (fun fmt lib -> fprintf fmt "-l%s" lib)) (lib_dependencies dependencies)
73
    ;
74
 fprintf fmt "@.";
75
 fprintf fmt "clean:@.";
76
 fprintf fmt "\t\\rm -f *.o %s_%s@." basename nodename;
77
 fprintf fmt "@.";
78
 Mod.other_targets fmt basename nodename dependencies;
79
 fprintf fmt "@.";
80

    
81
end
82

    
83
(* Local Variables: *)
84
(* compile-command:"make -C ../../.." *)
85
(* End: *)