Mantis Bug Tracker

View Issue Details Jump to Notes ] Issue History ] Print ]
IDProjectCategoryView StatusDate SubmittedLast Update
0006059OCamlOCamlbuild (the tool)public2013-06-29 20:022013-08-06 21:02
Reporteravsm 
Assigned Togasche 
PrioritynormalSeverityfeatureReproducibilityalways
StatusresolvedResolutionsuspended 
PlatformOSOS Version
Product Version 
Target VersionFixed in Version 
Summary0006059: add -output-obj rules for ocamlbuild
DescriptionAdd -output-obj rules to ocamlbuild for byte and native code.

Three rules are added:
%.byte.o : bytecode object file
%.byte.c : bytecode source C file
%.native.o : native code object file

https://github.com/avsm/ocaml/commit/fde233bdad4f9512d040764e86c9e7d2cfd0cda7 [^]
or
https://github.com/avsm/ocaml/commit/fde233bdad4f9512d040764e86c9e7d2cfd0cda7.patch [^]


From fde233bdad4f9512d040764e86c9e7d2cfd0cda7 Mon Sep 17 00:00:00 2001
From: Anil Madhavapeddy <anil@recoil.org>
Date: Sat, 29 Jun 2013 18:54:26 +0100
Subject: [PATCH] Add -output-obj rules to ocamlbuild for byte and native code

Three rules are added:
%.byte.o : bytecode object file
%.byte.c : bytecode source C file
%.native.o : native code object file
---
 ocamlbuild/ocaml_compiler.ml | 6 ++++++
 ocamlbuild/ocaml_compiler.mli | 2 ++
 ocamlbuild/ocaml_specific.ml | 18 ++++++++++++++++++
 3 files changed, 26 insertions(+)

diff --git a/ocamlbuild/ocaml_compiler.ml b/ocamlbuild/ocaml_compiler.ml
index 218842f..39a68f8 100644
--- a/ocamlbuild/ocaml_compiler.ml
+++ b/ocamlbuild/ocaml_compiler.ml
@@ -231,6 +231,9 @@ let byte_link_gen = link_gen "cmo" "cma" "cma" ["cmo"; "cmi"]
 let byte_link = byte_link_gen ocamlc_link_prog
   (fun tags -> tags++"ocaml"++"link"++"byte"++"program")
 
+let byte_output_obj = byte_link_gen ocamlc_link_prog
+ (fun tags -> tags++"ocaml"++"link"++"byte"++"output_obj")
+
 let byte_library_link = byte_link_gen byte_lib_linker byte_lib_linker_tags
 
 let byte_debug_link_gen =
@@ -248,6 +251,9 @@ let native_link_gen linker =
 let native_link x = native_link_gen ocamlopt_link_prog
   (fun tags -> tags++"ocaml"++"link"++"native"++"program") x
 
+let native_output_obj x = native_link_gen ocamlopt_link_prog
+ (fun tags -> tags++"ocaml"++"link"++"native"++"output_obj") x
+
 let native_library_link x =
   native_link_gen native_lib_linker native_lib_linker_tags x
 
diff --git a/ocamlbuild/ocaml_compiler.mli b/ocamlbuild/ocaml_compiler.mli
index 667191a..24c3695 100644
--- a/ocamlbuild/ocaml_compiler.mli
+++ b/ocamlbuild/ocaml_compiler.mli
@@ -41,10 +41,12 @@ val link_gen :
   (Tags.t -> Tags.t) ->
   string -> string -> Rule.action
 val byte_link : string -> string -> Rule.action
+val byte_output_obj : string -> string -> Rule.action
 val byte_library_link : string -> string -> Rule.action
 val byte_debug_link : string -> string -> Rule.action
 val byte_debug_library_link : string -> string -> Rule.action
 val native_link : string -> string -> Rule.action
+val native_output_obj : string -> string -> Rule.action
 val native_library_link : string -> string -> Rule.action
 val native_shared_library_link : ?tags:(string list) -> string -> string -> Rule.action
 val native_profile_link : string -> string -> Rule.action
diff --git a/ocamlbuild/ocaml_specific.ml b/ocamlbuild/ocaml_specific.ml
index c433025..a5873ae 100644
--- a/ocamlbuild/ocaml_specific.ml
+++ b/ocamlbuild/ocaml_specific.ml
@@ -160,6 +160,18 @@ rule "ocaml: cmo* -> byte"
   ~dep:"%.cmo"
   (Ocaml_compiler.byte_link "%.cmo" "%.byte");;
 
+rule "ocaml: cmo* -> byte.o"
+ ~tags:["ocaml"; "byte"; "link"; "output_obj" ]
+ ~prod:"%.byte.o"
+ ~dep:"%.cmo"
+ (Ocaml_compiler.byte_output_obj "%.cmo" "%.byte.o");;
+
+rule "ocaml: cmo* -> byte.c"
+ ~tags:["ocaml"; "byte"; "link"; "output_obj" ]
+ ~prod:"%.byte.c"
+ ~dep:"%.cmo"
+ (Ocaml_compiler.byte_output_obj "%.cmo" "%.byte.c");;
+
 rule "ocaml: p.cmx* & p.o* -> p.native"
   ~tags:["ocaml"; "native"; "profile"; "program"]
   ~prod:"%.p.native"
@@ -172,6 +184,12 @@ rule "ocaml: cmx* & o* -> native"
   ~deps:["%.cmx"; x_o]
   (Ocaml_compiler.native_link "%.cmx" "%.native");;
 
+rule "ocaml: cmx* & o* -> native.o"
+ ~tags:["ocaml"; "native"; "output_obj" ]
+ ~prod:"%.native.o"
+ ~deps:["%.cmx"; x_o]
+ (Ocaml_compiler.native_output_obj "%.cmx" "%.native.o");;
+
 rule "ocaml: mllib & d.cmo* -> d.cma"
   ~tags:["ocaml"; "byte"; "debug"; "library"]
   ~prod:"%.d.cma"
--
1.8.1.6
Steps To Reproduce$ ocamlbuild.byte -classic-display t.native.o
/usr/local/bin/ocamldep.opt -modules t.ml > t.ml.depends
/usr/local/bin/ocamlc.opt -c -o t.cmo t.ml
/usr/local/bin/ocamlopt.opt -c -o t.cmx t.ml
/usr/local/bin/ocamlopt.opt -output-obj t.cmx -o t.native.o
$ ocamlbuild.byte -classic-display t.byte.o
/usr/local/bin/ocamldep.opt -modules t.ml > t.ml.depends
/usr/local/bin/ocamlc.opt -c -o t.cmo t.ml
/usr/local/bin/ocamlc.opt -output-obj t.cmo -o t.byte.o
+ /usr/local/bin/ocamlc.opt -output-obj t.cmo -o t.byte.o
clang: warning: argument unused during compilation: '-fno-defer-pop'
$ ocamlbuild.byte -classic-display t.byte.c
/usr/local/bin/ocamldep.opt -modules t.ml > t.ml.depends
/usr/local/bin/ocamlc.opt -c -o t.cmo t.ml
/usr/local/bin/ocamlc.opt -output-obj t.cmo -o t.byte.c
$ ocamlbuild.byte -classic-display t.byte
/usr/local/bin/ocamldep.opt -modules t.ml > t.ml.depends
/usr/local/bin/ocamlc.opt -c -o t.cmo t.ml
/usr/local/bin/ocamlc.opt t.cmo -o t.byte
$ ocamlbuild/ocamlbuild.byte -classic-display t.native
/usr/local/bin/ocamldep.opt -modules t.ml > t.ml.depends
/usr/local/bin/ocamlc.opt -c -o t.cmo t.ml
/usr/local/bin/ocamlopt.opt -c -o t.cmx t.ml
/usr/local/bin/ocamlopt.opt t.cmx -o t.native
Additional InformationI think this is the last rule needed for Mirage to compile up Xen kernels using vanilla ocamlbuild.
Tagsjunior_job
Attached Filesdiff file icon output_obj_ext.diff [^] (1,537 bytes) 2013-06-30 11:31 [Show Content]

- Relationships

-  Notes
(0009648)
gasche (developer)
2013-06-29 20:18

The patch looks fine and Wojciech agrees this should be merged, so I'll commit it upstream soon.

Would you consider adding testcases to the testsuite corresponding to those new features? It is in the testsuite/ directory, and you can just edit the level0.ml file to add new test cases. It is rather self-descriptive and easy to write new tests.
(0009649)
avsm (reporter)
2013-06-29 22:37

Test case added and verified to work with the patch.
https://github.com/avsm/ocaml/commit/bb3a2c81970ebb4733dd700287193194929753cc [^]
https://github.com/avsm/ocaml/commit/bb3a2c81970ebb4733dd700287193194929753cc.patch [^]


From bb3a2c81970ebb4733dd700287193194929753cc Mon Sep 17 00:00:00 2001
From: Anil Madhavapeddy <anil@recoil.org>
Date: Sat, 29 Jun 2013 21:35:27 +0100
Subject: [PATCH] add test case for fde233bdad4f9512d040764e86c9e7d2cfd0cda7

---
 ocamlbuild/testsuite/level0.ml | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/ocamlbuild/testsuite/level0.ml b/ocamlbuild/testsuite/level0.ml
index c538910..52739e4 100644
--- a/ocamlbuild/testsuite/level0.ml
+++ b/ocamlbuild/testsuite/level0.ml
@@ -162,4 +162,9 @@ test "NoIncludeNoHygiene3"
             (* will make hygiene fail if must_ignore/ is checked *)
   ~targets:("hello.byte",[]) ();;
 
+test "OutputObj"
+ ~description:"output_obj targets for native and bytecode (PR 0006049)"
+ ~tree:[T.f "hello.ml" ~content:"print_endline \"Hello, World!\""]
+ ~targets:("hello.byte.o",["hello.byte.c";"hello.native.o"]) ();;
+
 run ~root:"_test";;
--
1.8.1.6
(0009650)
avsm (reporter)
2013-06-29 23:03

I've also made a cleanup patch intended for trunk (not 4.01) that removes the very confusing ~tags argument to Rule.rule, which is completely unused and serves only as a trap for an unwary ocamlbuild plugin developer.

https://github.com/avsm/ocaml/commit/168dabc8da8add283a7fa390ff700d97c3907974.patch [^]
(this conflicts with the above patch very slightly, but should be easy to fix up)
I've only lightly tested it, so wouldn't recommend merging into the 4.1 branch.

From 168dabc8da8add283a7fa390ff700d97c3907974 Mon Sep 17 00:00:00 2001
From: Anil Madhavapeddy <anil@recoil.org>
Date: Sat, 29 Jun 2013 21:57:24 +0100
Subject: [PATCH] Remove the deprecated ocamlbuild Rule.rule ~tags argument.

It's very confusing leaving this here, because it's set in the
various rules but has absolutely no effect. The actual tags are
set by the rule bodies, which (almost) duplicate the tags that
are removed by this commit.
---
 ocamlbuild/ocaml_specific.ml | 35 -----------------------------------
 ocamlbuild/rule.ml | 20 ++++++++------------
 ocamlbuild/rule.mli | 1 -
 ocamlbuild/signatures.mli | 3 +--
 4 files changed, 9 insertions(+), 50 deletions(-)

diff --git a/ocamlbuild/ocaml_specific.ml b/ocamlbuild/ocaml_specific.ml
index a4c6e46..2a9ea16 100644
--- a/ocamlbuild/ocaml_specific.ml
+++ b/ocamlbuild/ocaml_specific.ml
@@ -75,123 +75,103 @@ rule "target files"
   end;;
 
 rule "ocaml: mli -> cmi"
- ~tags:["ocaml"]
   ~prod:"%.cmi"
   ~deps:["%.mli"; "%.mli.depends"]
   (Ocaml_compiler.compile_ocaml_interf "%.mli" "%.cmi");;
 
 rule "ocaml: mlpack & d.cmo* -> d.cmo & cmi"
- ~tags:["ocaml"; "debug"; "byte"]
   ~prods:["%.d.cmo"]
   ~deps:["%.mlpack"; "%.cmi"]
   (Ocaml_compiler.byte_debug_pack_mlpack "%.mlpack" "%.d.cmo");;
 
 rule "ocaml: mlpack & cmo* & cmi -> cmo"
- ~tags:["ocaml"; "byte"]
   ~prod:"%.cmo"
   ~deps:["%.mli"; "%.cmi"; "%.mlpack"]
   (Ocaml_compiler.byte_pack_mlpack "%.mlpack" "%.cmo");;
 
 rule "ocaml: mlpack & cmo* -> cmo & cmi"
- ~tags:["ocaml"; "byte"]
   ~prods:["%.cmo"; "%.cmi"]
   ~dep:"%.mlpack"
   (Ocaml_compiler.byte_pack_mlpack "%.mlpack" "%.cmo");;
 
 rule "ocaml: ml & cmi -> d.cmo"
- ~tags:["ocaml"; "byte"]
   ~prod:"%.d.cmo"
   ~deps:["%.mli"(* This one is inserted to force this rule to be skiped when
     a .ml is provided without a .mli *); "%.ml"; "%.ml.depends"; "%.cmi"]
   (Ocaml_compiler.byte_compile_ocaml_implem ~tag:"debug" "%.ml" "%.d.cmo");;
 
 rule "ocaml: ml & cmi -> cmo"
- ~tags:["ocaml"; "byte"]
   ~prod:"%.cmo"
   ~deps:["%.mli"(* This one is inserted to force this rule to be skiped when
     a .ml is provided without a .mli *); "%.ml"; "%.ml.depends"; "%.cmi"]
   (Ocaml_compiler.byte_compile_ocaml_implem "%.ml" "%.cmo");;
 
 rule "ocaml: mlpack & cmi & p.cmx* & p.o* -> p.cmx & p.o"
- ~tags:["ocaml"; "profile"; "native"]
   ~prods:["%.p.cmx"; x_p_o(* no cmi here you must make the byte version to have it *)]
   ~deps:["%.mlpack"; "%.cmi"]
   (Ocaml_compiler.native_profile_pack_mlpack "%.mlpack" "%.p.cmx");;
 
 rule "ocaml: mlpack & cmi & cmx* & o* -> cmx & o"
- ~tags:["ocaml"; "native"]
   ~prods:["%.cmx"; x_o(* no cmi here you must make the byte version to have it *)]
   ~deps:["%.mlpack"; "%.cmi"]
   (Ocaml_compiler.native_pack_mlpack "%.mlpack" "%.cmx");;
 
 rule "ocaml: ml & cmi -> p.cmx & p.o"
- ~tags:["ocaml"; "native"; "profile"]
   ~prods:["%.p.cmx"; x_p_o]
   ~deps:["%.ml"; "%.ml.depends"; "%.cmi"]
   (Ocaml_compiler.native_compile_ocaml_implem ~tag:"profile" ~cmx_ext:"p.cmx" "%.ml");;
 
 rule "ocaml: ml & cmi -> cmx & o"
- ~tags:["ocaml"; "native"]
   ~prods:["%.cmx"; x_o]
   ~deps:["%.ml"; "%.ml.depends"; "%.cmi"]
   (Ocaml_compiler.native_compile_ocaml_implem "%.ml");;
 
 rule "ocaml: ml -> d.cmo & cmi"
- ~tags:["ocaml"; "debug"]
   ~prods:["%.d.cmo"]
   ~deps:["%.ml"; "%.ml.depends"; "%.cmi"]
   (Ocaml_compiler.byte_compile_ocaml_implem ~tag:"debug" "%.ml" "%.d.cmo");;
 
 rule "ocaml: ml -> cmo & cmi"
- ~tags:["ocaml"]
   ~prods:["%.cmo"; "%.cmi"]
   ~deps:["%.ml"; "%.ml.depends"]
   (Ocaml_compiler.byte_compile_ocaml_implem "%.ml" "%.cmo");;
 
 rule "ocaml: d.cmo* -> d.byte"
- ~tags:["ocaml"; "byte"; "debug"; "program"]
   ~prod:"%.d.byte"
   ~dep:"%.d.cmo"
   (Ocaml_compiler.byte_debug_link "%.d.cmo" "%.d.byte");;
 
 rule "ocaml: cmo* -> byte"
- ~tags:["ocaml"; "byte"; "program"]
   ~prod:"%.byte"
   ~dep:"%.cmo"
   (Ocaml_compiler.byte_link "%.cmo" "%.byte");;
 
 rule "ocaml: p.cmx* & p.o* -> p.native"
- ~tags:["ocaml"; "native"; "profile"; "program"]
   ~prod:"%.p.native"
   ~deps:["%.p.cmx"; x_p_o]
   (Ocaml_compiler.native_profile_link "%.p.cmx" "%.p.native");;
 
 rule "ocaml: cmx* & o* -> native"
- ~tags:["ocaml"; "native"; "program"]
   ~prod:"%.native"
   ~deps:["%.cmx"; x_o]
   (Ocaml_compiler.native_link "%.cmx" "%.native");;
 
 rule "ocaml: mllib & d.cmo* -> d.cma"
- ~tags:["ocaml"; "byte"; "debug"; "library"]
   ~prod:"%.d.cma"
   ~dep:"%.mllib"
   (Ocaml_compiler.byte_debug_library_link_mllib "%.mllib" "%.d.cma");;
 
 rule "ocaml: mllib & cmo* -> cma"
- ~tags:["ocaml"; "byte"; "library"]
   ~prod:"%.cma"
   ~dep:"%.mllib"
   (Ocaml_compiler.byte_library_link_mllib "%.mllib" "%.cma");;
 
 rule "ocaml: d.cmo* -> d.cma"
- ~tags:["ocaml"; "byte"; "debug"; "library"]
   ~prod:"%.d.cma"
   ~dep:"%.d.cmo"
   (Ocaml_compiler.byte_debug_library_link "%.d.cmo" "%.d.cma");;
 
 rule "ocaml: cmo* -> cma"
- ~tags:["ocaml"; "byte"; "library"]
   ~prod:"%.cma"
   ~dep:"%.cmo"
   (Ocaml_compiler.byte_library_link "%.cmo" "%.cma");;
@@ -206,67 +186,56 @@ rule "ocaml C stubs: clib & (o|obj)* -> (a|lib) & (so|dll)"
   (C_tools.link_C_library "%(path)lib%(libname).clib" ("%(path)lib%(libname)"-.-ext_lib) "%(path)%(libname)");;
 
 rule "ocaml: mllib & p.cmx* & p.o* -> p.cmxa & p.a"
- ~tags:["ocaml"; "native"; "profile"; "library"]
   ~prods:["%.p.cmxa"; x_p_a]
   ~dep:"%.mllib"
   (Ocaml_compiler.native_profile_library_link_mllib "%.mllib" "%.p.cmxa");;
 
 rule "ocaml: mllib & cmx* & o* -> cmxa & a"
- ~tags:["ocaml"; "native"; "library"]
   ~prods:["%.cmxa"; x_a]
   ~dep:"%.mllib"
   (Ocaml_compiler.native_library_link_mllib "%.mllib" "%.cmxa");;
 
 rule "ocaml: p.cmx & p.o -> p.cmxa & p.a"
- ~tags:["ocaml"; "native"; "profile"; "library"]
   ~prods:["%.p.cmxa"; x_p_a]
   ~deps:["%.p.cmx"; x_p_o]
   (Ocaml_compiler.native_profile_library_link "%.p.cmx" "%.p.cmxa");;
 
 rule "ocaml: cmx & o -> cmxa & a"
- ~tags:["ocaml"; "native"; "library"]
   ~prods:["%.cmxa"; x_a]
   ~deps:["%.cmx"; x_o]
   (Ocaml_compiler.native_library_link "%.cmx" "%.cmxa");;
 
 rule "ocaml: mldylib & p.cmx* & p.o* -> p.cmxs & p.so"
- ~tags:["ocaml"; "native"; "profile"; "shared"; "library"]
   ~prods:["%.p.cmxs"; x_p_dll]
   ~dep:"%.mldylib"
   (Ocaml_compiler.native_profile_shared_library_link_mldylib "%.mldylib" "%.p.cmxs");;
 
 rule "ocaml: mldylib & cmx* & o* -> cmxs & so"
- ~tags:["ocaml"; "native"; "shared"; "library"]
   ~prods:["%.cmxs"; x_dll]
   ~dep:"%.mldylib"
   (Ocaml_compiler.native_shared_library_link_mldylib "%.mldylib" "%.cmxs");;
 
 rule "ocaml: p.cmx & p.o -> p.cmxs & p.so"
- ~tags:["ocaml"; "native"; "profile"; "shared"; "library"]
   ~prods:["%.p.cmxs"; x_p_dll]
   ~deps:["%.p.cmx"; x_p_o]
   (Ocaml_compiler.native_shared_library_link ~tags:["profile"] "%.p.cmx" "%.p.cmxs");;
 
 rule "ocaml: p.cmxa & p.a -> p.cmxs & p.so"
- ~tags:["ocaml"; "native"; "profile"; "shared"; "library"]
   ~prods:["%.p.cmxs"; x_p_dll]
   ~deps:["%.p.cmxa"; x_p_a]
   (Ocaml_compiler.native_shared_library_link ~tags:["profile";"linkall"] "%.p.cmxa" "%.p.cmxs");;
 
 rule "ocaml: cmx & o -> cmxs"
- ~tags:["ocaml"; "native"; "shared"; "library"]
   ~prods:["%.cmxs"]
   ~deps:["%.cmx"; x_o]
   (Ocaml_compiler.native_shared_library_link "%.cmx" "%.cmxs");;
 
 rule "ocaml: cmx & o -> cmxs & so"
- ~tags:["ocaml"; "native"; "shared"; "library"]
   ~prods:["%.cmxs"; x_dll]
   ~deps:["%.cmx"; x_o]
   (Ocaml_compiler.native_shared_library_link "%.cmx" "%.cmxs");;
 
 rule "ocaml: cmxa & a -> cmxs & so"
- ~tags:["ocaml"; "native"; "shared"; "library"]
   ~prods:["%.cmxs"; x_dll]
   ~deps:["%.cmxa"; x_a]
   (Ocaml_compiler.native_shared_library_link ~tags:["linkall"] "%.cmxa" "%.cmxs");;
@@ -282,19 +251,16 @@ rule "ocaml dependencies mli"
   (Ocaml_tools.ocamldep_command "%.mli" "%.mli.depends");;
 
 rule "ocamllex"
- ~tags:["ocaml"] (* FIXME "lexer" *)
   ~prod:"%.ml"
   ~dep:"%.mll"
   (Ocaml_tools.ocamllex "%.mll");;
 
 rule "ocaml: mli -> odoc"
- ~tags:["ocaml"; "doc"]
   ~prod:"%.odoc"
   ~deps:["%.mli"; "%.mli.depends"]
   (Ocaml_tools.document_ocaml_interf "%.mli" "%.odoc");;
 
 rule "ocaml: ml -> odoc"
- ~tags:["ocaml"; "doc"]
   ~prod:"%.odoc"
   ~deps:["%.ml"; "%.ml.depends"]
   (Ocaml_tools.document_ocaml_implem "%.ml" "%.odoc");;
@@ -346,7 +312,6 @@ if !Options.use_menhir || Configuration.has_tag "use_menhir" then begin
 
 end else
   rule "ocamlyacc"
- ~tags:["ocaml"] (* FIXME "parser" *)
     ~prods:["%.ml"; "%.mli"]
     ~dep:"%.mly"
     (Ocaml_tools.ocamlyacc "%.mly");;
diff --git a/ocamlbuild/rule.ml b/ocamlbuild/rule.ml
index d28833d..2c9c0e2 100644
--- a/ocamlbuild/rule.ml
+++ b/ocamlbuild/rule.ml
@@ -29,7 +29,6 @@ type digest_command = { digest : string; command : Command.t }
 
 type 'a gen_rule =
   { name : string;
- tags : Tags.t;
     deps : Pathname.t list; (* These pathnames must be normalized *)
     prods : 'a list; (* Note that prods also contains stamp *)
     stamp : 'a option;
@@ -52,8 +51,8 @@ let print_rule_name f r = pp_print_string f r.name
 let print_resource_list = List.print Resource.print
 
 let print_rule_contents ppelt f r =
- fprintf f "@[<v2>{@ @[<2>name =@ %S@];@ @[<2>tags =@ %a@];@ @[<2>deps =@ %a@];@ @[<2>prods = %a@];@ @[<2>code = <fun>@]@]@ }"
- r.name Tags.print r.tags print_resource_list r.deps (List.print ppelt) r.prods
+ fprintf f "@[<v2>{@ @[<2>name =@ %S@];@ @[<2>deps =@ %a@];@ @[<2>prods = %a@];@ @[<2>code = <fun>@]@]@ }"
+ r.name print_resource_list r.deps (List.print ppelt) r.prods
 
 let pretty_print ppelt f r =
   fprintf f "@[<hv2>rule@ %S@ ~deps:%a@ ~prods:%a@ <fun>@]"
@@ -67,11 +66,11 @@ let subst env rule =
   let finder next_finder p = next_finder (Resource.subst_any env p) in
   let stamp = match rule.stamp with None -> None | Some x -> Some (Resource.subst_pattern env x) in
   let prods = subst_resource_patterns rule.prods in
- { (rule) with name = sbprintf "%s (%a)" rule.name Resource.print_env env;
- prods = prods;
- deps = subst_resources rule.deps; (* The substition should preserve normalization of pathnames *)
- stamp = stamp;
- code = (fun env -> rule.code (finder env)) }
+ { name = sbprintf "%s (%a)" rule.name Resource.print_env env;
+ prods = prods;
+ deps = subst_resources rule.deps; (* The substition should preserve normalization of pathnames *)
+ stamp = stamp;
+ code = (fun env -> rule.code (finder env)) }
 
 exception Can_produce of rule
 
@@ -84,8 +83,6 @@ let can_produce target rule =
     end rule.prods; None
   with Can_produce r -> Some r
 
-(* let tags_matches tags r = if Tags.does_match tags r.tags then Some r else None *)
-
 let digest_prods r =
   List.fold_right begin fun p acc ->
     let f = Pathname.to_string (Resource.in_build_dir p) in
@@ -252,7 +249,7 @@ let (get_rules, add_rule, clear_rules) =
   end,
   (fun () -> rules := [])
 
-let rule name ?(tags=[]) ?(prods=[]) ?(deps=[]) ?prod ?dep ?stamp ?(insert = `bottom) code =
+let rule name ?(prods=[]) ?(deps=[]) ?prod ?dep ?stamp ?(insert = `bottom) code =
   let res_add import xs xopt =
     let init =
       match xopt with
@@ -281,7 +278,6 @@ let rule name ?(tags=[]) ?(prods=[]) ?(deps=[]) ?prod ?dep ?stamp ?(insert = `bo
   in
   add_rule insert
   { name = name;
- tags = List.fold_right Tags.add tags Tags.empty;
     deps = res_add Resource.import (* should normalize *) deps dep;
     stamp = stamp;
     prods = prods;
diff --git a/ocamlbuild/rule.mli b/ocamlbuild/rule.mli
index 0acb125..02ce129 100644
--- a/ocamlbuild/rule.mli
+++ b/ocamlbuild/rule.mli
@@ -35,7 +35,6 @@ val deps_of_rule : 'a gen_rule -> Pathname.t list
 val prods_of_rule : 'a gen_rule -> 'a list
 
 val rule : string ->
- ?tags:string list ->
   ?prods:string list ->
   ?deps:string list ->
   ?prod:string ->
diff --git a/ocamlbuild/signatures.mli b/ocamlbuild/signatures.mli
index bc21778..d7f80fe 100644
--- a/ocamlbuild/signatures.mli
+++ b/ocamlbuild/signatures.mli
@@ -601,9 +601,8 @@ module type PLUGIN = sig
         automatically produced by ocamlbuild. This file can serve as a virtual
         target (or phony target), since it will be filled up by a digest of
         it dependencies.
- - The ~tags argument in deprecated, don't use it. *)
+ *)
   val rule : string ->
- ?tags:string list ->
     ?prods:string list ->
     ?deps:string list ->
     ?prod:string ->
--
1.8.1.6
(0009651)
gasche (developer)
2013-06-30 10:54

The feature and its test are now included in trunk and version/4.01.

I have two remaining worries (that may not require immediate action but maybe help people coming back at this PR in the future):

- only statically-linked object files (.o) are supported, while -output-obj also supports producing object files for dynamic linking (.so); we may want to complete that feature
- .o and .so are the unix prefixes for object files, as opposed to Windows prefixes (.obj and .dll) that are also supported by the compiler. I wonder if not also supporting .obj and .dll target may make life harder for windows user.
(0009652)
gasche (developer)
2013-06-30 11:35

I just uploaded here the minor patch "output_obj_ext.diff" that parametrizes the target name over the right extension. In theory this should allow building "foo.byte.obj" over Windows, but I don't have access to a Windows machine to test it.
(0009655)
avsm (reporter)
2013-06-30 20:03

The output_obj_ext.diff looks correct to me, although I also don't have a WIndows machine to test it on.
(0010138)
gasche (developer)
2013-08-06 21:01
edited on: 2013-08-06 21:03

I integrated the windows-extensions patch. I'm marking this bug as resolved>suspended, because we still lack support for .so/.dll files. Not having experience using those, I don't feel like implementing support that I don't know how to test. Please, dear future user, if you come over this bugtracker item with a need for .so/.dll -output-obj support, complain and bring us a reproducible use-case to test.

I also integrated a variant of Anil's ~tags-removing patch. Instead of removing completely the ~tags argument for the interface (which would provoke build failure on all myocamlbuild.ml using old code), I chose to emit a warning at runtime: "Warning: your ocamlbuild rule %S uses the ~tags parameter, which is deprecated and ignored."


- Issue History
Date Modified Username Field Change
2013-06-29 20:02 avsm New Issue
2013-06-29 20:18 gasche Note Added: 0009648
2013-06-29 20:19 gasche Assigned To => gasche
2013-06-29 20:19 gasche Status new => assigned
2013-06-29 22:37 avsm Note Added: 0009649
2013-06-29 23:03 avsm Note Added: 0009650
2013-06-30 10:54 gasche Note Added: 0009651
2013-06-30 11:31 gasche File Added: output_obj_ext.diff
2013-06-30 11:35 gasche Note Added: 0009652
2013-06-30 20:03 avsm Note Added: 0009655
2013-08-06 21:01 gasche Note Added: 0010138
2013-08-06 21:01 gasche Status assigned => resolved
2013-08-06 21:01 gasche Resolution open => fixed
2013-08-06 21:02 gasche Resolution fixed => suspended
2013-08-06 21:02 gasche Tag Attached: junior_job
2013-08-06 21:03 gasche Note Edited: 0010138 View Revisions


Copyright © 2000 - 2011 MantisBT Group
Powered by Mantis Bugtracker