|
@@ -418,6 +418,20 @@ let join_class_path_remap path separator =
|
|
| x -> x
|
|
| x -> x
|
|
;;
|
|
;;
|
|
|
|
|
|
|
|
+let make_path_absolute path pos =
|
|
|
|
+ try
|
|
|
|
+ if (String.sub path 0 2) = "./" then begin
|
|
|
|
+ let base = if (Filename.is_relative pos.pfile) then
|
|
|
|
+ Filename.concat (Sys.getcwd()) pos.pfile
|
|
|
|
+ else
|
|
|
|
+ pos.pfile
|
|
|
|
+ in
|
|
|
|
+ Path.normalize_path (Filename.concat (Filename.dirname base) (String.sub path 2 ((String.length path) -2)))
|
|
|
|
+ end else
|
|
|
|
+ path
|
|
|
|
+ with Invalid_argument _ -> path
|
|
|
|
+;;
|
|
|
|
+
|
|
let get_meta_string meta key =
|
|
let get_meta_string meta key =
|
|
let rec loop = function
|
|
let rec loop = function
|
|
| [] -> ""
|
|
| [] -> ""
|
|
@@ -427,28 +441,27 @@ let get_meta_string meta key =
|
|
loop meta
|
|
loop meta
|
|
;;
|
|
;;
|
|
|
|
|
|
-
|
|
|
|
-
|
|
|
|
let get_meta_string_path meta key =
|
|
let get_meta_string_path meta key =
|
|
let rec loop = function
|
|
let rec loop = function
|
|
| [] -> ""
|
|
| [] -> ""
|
|
| (k,[Ast.EConst (Ast.String(name,_)),_], pos) :: _ when k=key->
|
|
| (k,[Ast.EConst (Ast.String(name,_)),_], pos) :: _ when k=key->
|
|
- (try
|
|
|
|
- if (String.sub name 0 2) = "./" then begin
|
|
|
|
- let base = if (Filename.is_relative pos.pfile) then
|
|
|
|
- Filename.concat (Sys.getcwd()) pos.pfile
|
|
|
|
- else
|
|
|
|
- pos.pfile
|
|
|
|
- in
|
|
|
|
- Path.normalize_path (Filename.concat (Filename.dirname base) (String.sub name 2 ((String.length name) -2) ))
|
|
|
|
- end else
|
|
|
|
- name
|
|
|
|
- with Invalid_argument _ -> name)
|
|
|
|
|
|
+ make_path_absolute name pos
|
|
| _ :: l -> loop l
|
|
| _ :: l -> loop l
|
|
in
|
|
in
|
|
loop meta
|
|
loop meta
|
|
;;
|
|
;;
|
|
|
|
|
|
|
|
+let get_all_meta_string_path meta_list key =
|
|
|
|
+ let extract_path pos expr =
|
|
|
|
+ match expr with
|
|
|
|
+ | (Ast.EConst (Ast.String(name, _)), _) -> make_path_absolute name pos
|
|
|
|
+ | _ -> "" in
|
|
|
|
+ let extract_meta meta =
|
|
|
|
+ match meta with
|
|
|
|
+ | (k, exprs, pos) when k = key -> Some (extract_path pos (List.hd exprs))
|
|
|
|
+ | _ -> None in
|
|
|
|
+ ExtList.List.filter_map extract_meta meta_list
|
|
|
|
+;;
|
|
|
|
|
|
let get_meta_string_full_filename meta key =
|
|
let get_meta_string_full_filename meta key =
|
|
let rec loop = function
|
|
let rec loop = function
|
|
@@ -4768,9 +4781,9 @@ let path_of_string path =
|
|
let find_referenced_types_flags ctx obj field_name super_deps constructor_deps header_only for_depends include_super_args =
|
|
let find_referenced_types_flags ctx obj field_name super_deps constructor_deps header_only for_depends include_super_args =
|
|
let types = ref PMap.empty in
|
|
let types = ref PMap.empty in
|
|
if for_depends then begin
|
|
if for_depends then begin
|
|
- let include_file = get_meta_string_path (t_infos obj).mt_meta Meta.Depend in
|
|
|
|
- if (include_file<>"") then
|
|
|
|
- types := (PMap.add ( path_of_string include_file ) true !types);
|
|
|
|
|
|
+ let include_files = get_all_meta_string_path (t_infos obj).mt_meta Meta.Depend in
|
|
|
|
+ let include_adder = fun inc -> types := (PMap.add ( path_of_string inc ) true !types) in
|
|
|
|
+ List.iter include_adder include_files;
|
|
end;
|
|
end;
|
|
let rec add_type_flag isNative in_path =
|
|
let rec add_type_flag isNative in_path =
|
|
if ( not (PMap.mem in_path !types)) then begin
|
|
if ( not (PMap.mem in_path !types)) then begin
|
|
@@ -4784,9 +4797,9 @@ let find_referenced_types_flags ctx obj field_name super_deps constructor_deps h
|
|
in
|
|
in
|
|
let add_extern_type decl =
|
|
let add_extern_type decl =
|
|
let tinfo = t_infos decl in
|
|
let tinfo = t_infos decl in
|
|
- let include_file = get_meta_string_path tinfo.mt_meta (if for_depends then Meta.Depend else Meta.Include) in
|
|
|
|
- if (include_file<>"") then
|
|
|
|
- add_type ( path_of_string include_file )
|
|
|
|
|
|
+ let include_files = get_all_meta_string_path tinfo.mt_meta (if for_depends then Meta.Depend else Meta.Include) in
|
|
|
|
+ if List.length include_files > 0 then
|
|
|
|
+ List.iter (fun inc -> add_type(path_of_string inc)) include_files
|
|
else if (not for_depends) && (has_meta_key tinfo.mt_meta Meta.Include) then
|
|
else if (not for_depends) && (has_meta_key tinfo.mt_meta Meta.Include) then
|
|
add_type tinfo.mt_path
|
|
add_type tinfo.mt_path
|
|
in
|
|
in
|
|
@@ -4795,9 +4808,9 @@ let find_referenced_types_flags ctx obj field_name super_deps constructor_deps h
|
|
add_extern_type (TClassDecl klass)
|
|
add_extern_type (TClassDecl klass)
|
|
in
|
|
in
|
|
let add_native_gen_class klass =
|
|
let add_native_gen_class klass =
|
|
- let include_file = get_meta_string_path klass.cl_meta (if for_depends then Meta.Depend else Meta.Include) in
|
|
|
|
- if (include_file<>"") then
|
|
|
|
- add_type ( path_of_string include_file )
|
|
|
|
|
|
+ let include_files = get_all_meta_string_path klass.cl_meta (if for_depends then Meta.Depend else Meta.Include) in
|
|
|
|
+ if List.length include_files > 0 then
|
|
|
|
+ List.iter (fun inc -> add_type ( path_of_string inc )) include_files
|
|
else if for_depends then
|
|
else if for_depends then
|
|
add_type klass.cl_path
|
|
add_type klass.cl_path
|
|
else begin
|
|
else begin
|
|
@@ -5886,9 +5899,9 @@ let generate_class_files baseCtx super_deps constructor_deps class_def inScripta
|
|
cpp_file#write_h "\n";
|
|
cpp_file#write_h "\n";
|
|
|
|
|
|
output_cpp ( get_class_code class_def Meta.CppFileCode );
|
|
output_cpp ( get_class_code class_def Meta.CppFileCode );
|
|
- let inc = get_meta_string_path class_def.cl_meta Meta.CppInclude in
|
|
|
|
- if (inc<>"") then
|
|
|
|
- output_cpp ("#include \"" ^ inc ^ "\"\n");
|
|
|
|
|
|
+ let includes = get_all_meta_string_path class_def.cl_meta Meta.CppInclude in
|
|
|
|
+ let printer = fun inc -> output_cpp ("#include \"" ^ inc ^ "\"\n") in
|
|
|
|
+ List.iter printer includes;
|
|
|
|
|
|
gen_open_namespace output_cpp class_path;
|
|
gen_open_namespace output_cpp class_path;
|
|
output_cpp "\n";
|
|
output_cpp "\n";
|
|
@@ -6641,15 +6654,21 @@ let generate_class_files baseCtx super_deps constructor_deps class_def inScripta
|
|
(match class_def.cl_super with
|
|
(match class_def.cl_super with
|
|
| Some super ->
|
|
| Some super ->
|
|
let klass = fst super in
|
|
let klass = fst super in
|
|
- let include_file = get_meta_string_path klass.cl_meta Meta.Include in
|
|
|
|
- h_file#add_include (if include_file="" then klass.cl_path else path_of_string include_file)
|
|
|
|
|
|
+ let include_files = get_all_meta_string_path klass.cl_meta Meta.Include in
|
|
|
|
+ if List.length include_files > 0 then
|
|
|
|
+ List.iter (fun inc -> h_file#add_include (path_of_string inc)) include_files
|
|
|
|
+ else
|
|
|
|
+ h_file#add_include klass.cl_path
|
|
| _ -> () );
|
|
| _ -> () );
|
|
|
|
|
|
(* And any interfaces ... *)
|
|
(* And any interfaces ... *)
|
|
List.iter (fun imp->
|
|
List.iter (fun imp->
|
|
let interface = fst imp in
|
|
let interface = fst imp in
|
|
- let include_file = get_meta_string_path interface.cl_meta Meta.Include in
|
|
|
|
- h_file#add_include (if include_file="" then interface.cl_path else path_of_string include_file) )
|
|
|
|
|
|
+ let include_files = get_all_meta_string_path interface.cl_meta Meta.Include in
|
|
|
|
+ if List.length include_files > 0 then
|
|
|
|
+ List.iter (fun inc -> h_file#add_include (path_of_string inc)) include_files
|
|
|
|
+ else
|
|
|
|
+ h_file#add_include interface.cl_path)
|
|
(real_interfaces class_def.cl_implements);
|
|
(real_interfaces class_def.cl_implements);
|
|
|
|
|
|
(* Only need to forward-declare classes that are mentioned in the header file
|
|
(* Only need to forward-declare classes that are mentioned in the header file
|
|
@@ -6659,9 +6678,9 @@ let generate_class_files baseCtx super_deps constructor_deps class_def inScripta
|
|
output_h "\n";
|
|
output_h "\n";
|
|
|
|
|
|
output_h ( get_class_code class_def Meta.HeaderCode );
|
|
output_h ( get_class_code class_def Meta.HeaderCode );
|
|
- let inc = get_meta_string_path class_def.cl_meta Meta.HeaderInclude in
|
|
|
|
- if (inc<>"") then
|
|
|
|
- output_h ("#include \"" ^ inc ^ "\"\n");
|
|
|
|
|
|
+ let includes = get_all_meta_string_path class_def.cl_meta Meta.HeaderInclude in
|
|
|
|
+ let printer = fun inc -> output_h ("#include \"" ^ inc ^ "\"\n") in
|
|
|
|
+ List.iter printer includes;
|
|
|
|
|
|
gen_open_namespace output_h class_path;
|
|
gen_open_namespace output_h class_path;
|
|
output_h "\n\n";
|
|
output_h "\n\n";
|