1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
|
From a87c3f20e846c00e53d695497dba7038edbd12f0 Mon Sep 17 00:00:00 2001
From: Valentin Lorentz <progval@progval.net>
Date: Thu, 13 Aug 2015 11:59:04 +0200
Subject: [PATCH] Enable ocamldoc to build reproducible manpages
Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=794586
Signed-off-by: Stephane Glondu <steph@glondu.net>
---
ocamldoc/odoc_man.ml | 15 +++++----------
ocamldoc/odoc_misc.ml | 12 ++++++++++--
ocamldoc/odoc_misc.mli | 7 ++++++-
3 files changed, 21 insertions(+), 13 deletions(-)
diff --git a/ocamldoc/odoc_man.ml b/ocamldoc/odoc_man.ml
index 615c5e172..3c85aa32a 100644
--- a/ocamldoc/odoc_man.ml
+++ b/ocamldoc/odoc_man.ml
@@ -864,14 +864,13 @@ class man =
(** Generate the man page for the given class.*)
method generate_for_class cl =
Odoc_info.reset_type_names () ;
- let date = Unix.time () in
let file = self#file_name cl.cl_name in
try
let chanout = self#open_out file in
let b = new_buf () in
bs b (".TH \""^cl.cl_name^"\" ");
bs b !man_section ;
- bs b (" "^(Odoc_misc.string_of_date ~hour: false date)^" ");
+ bs b (" source: "^Odoc_misc.current_date^" ");
bs b "OCamldoc ";
bs b ("\""^(match !Global.title with Some t -> t | None -> "")^"\"\n");
@@ -923,14 +922,13 @@ class man =
(** Generate the man page for the given class type.*)
method generate_for_class_type ct =
Odoc_info.reset_type_names () ;
- let date = Unix.time () in
let file = self#file_name ct.clt_name in
try
let chanout = self#open_out file in
let b = new_buf () in
bs b (".TH \""^ct.clt_name^"\" ");
bs b !man_section ;
- bs b (" "^(Odoc_misc.string_of_date ~hour: false date)^" ");
+ bs b (" source: "^Odoc_misc.current_date^" ");
bs b "OCamldoc ";
bs b ("\""^(match !Global.title with Some t -> t | None -> "")^"\"\n");
@@ -1016,14 +1014,13 @@ class man =
(** Generate the man file for the given module type.
@raise Failure if an error occurs.*)
method generate_for_module_type mt =
- let date = Unix.time () in
let file = self#file_name mt.mt_name in
try
let chanout = self#open_out file in
let b = new_buf () in
bs b (".TH \""^mt.mt_name^"\" ");
bs b !man_section ;
- bs b (" "^(Odoc_misc.string_of_date ~hour: false date)^" ");
+ bs b (" source: "^Odoc_misc.current_date^" ");
bs b "OCamldoc ";
bs b ("\""^(match !Global.title with Some t -> t | None -> "")^"\"\n");
@@ -1099,14 +1096,13 @@ class man =
(** Generate the man file for the given module.
@raise Failure if an error occurs.*)
method generate_for_module m =
- let date = Unix.time () in
let file = self#file_name m.m_name in
try
let chanout = self#open_out file in
let b = new_buf () in
bs b (".TH \""^m.m_name^"\" ");
bs b !man_section ;
- bs b (" "^(Odoc_misc.string_of_date ~hour: false date)^" ");
+ bs b (" source: "^Odoc_misc.current_date^" ");
bs b "OCamldoc ";
bs b ("\""^(match !Global.title with Some t -> t | None -> "")^"\"\n");
@@ -1206,14 +1202,13 @@ class man =
| Res_const (_,f) -> f.vc_name
)
in
- let date = Unix.time () in
let file = self#file_name name in
try
let chanout = self#open_out file in
let b = new_buf () in
bs b (".TH \""^name^"\" ");
bs b !man_section ;
- bs b (" "^(Odoc_misc.string_of_date ~hour: false date)^" ");
+ bs b (" source: "^Odoc_misc.current_date^" ");
bs b "OCamldoc ";
bs b ("\""^(match !Global.title with Some t -> t | None -> "")^"\"\n");
bs b ".SH NAME\n";
diff --git a/ocamldoc/odoc_misc.ml b/ocamldoc/odoc_misc.ml
index 4c74476da..456225f62 100644
--- a/ocamldoc/odoc_misc.ml
+++ b/ocamldoc/odoc_misc.ml
@@ -223,9 +223,9 @@ let apply_opt f v_opt =
None -> None
| Some v -> Some (f v)
-let string_of_date ?(hour=true) d =
+let string_of_date ?(absolute=false) ?(hour=true) d =
let add_0 s = if String.length s < 2 then "0"^s else s in
- let t = Unix.localtime d in
+ let t = (if absolute then Unix.gmtime else Unix.localtime) d in
(string_of_int (t.Unix.tm_year + 1900))^"-"^
(add_0 (string_of_int (t.Unix.tm_mon + 1)))^"-"^
(add_0 (string_of_int t.Unix.tm_mday))^
@@ -238,6 +238,14 @@ let string_of_date ?(hour=true) d =
""
)
+let current_date =
+ let time =
+ try
+ float_of_string (Sys.getenv "SOURCE_DATE_EPOCH")
+ with
+ Not_found -> Unix.time ()
+ in string_of_date ~absolute: true ~hour: false time
+
let rec text_list_concat sep l =
match l with
diff --git a/ocamldoc/odoc_misc.mli b/ocamldoc/odoc_misc.mli
index dd5a7fcb9..38ff0612b 100644
--- a/ocamldoc/odoc_misc.mli
+++ b/ocamldoc/odoc_misc.mli
@@ -62,7 +62,12 @@ val apply_opt : ('a -> 'b) -> 'a option -> 'b option
(** Return a string representing a date given as a number of seconds
since 1970. The hour is optionnaly displayed. *)
-val string_of_date : ?hour:bool -> float -> string
+val string_of_date : ?absolute:bool -> ?hour:bool -> float -> string
+
+(* Value returned by string_of_date for current time.
+ * Uses environment variable SOURCE_DATE_EPOCH if set; falls back to
+ * current timestamp otherwise. *)
+val current_date : string
(** Return the first sentence (until the first dot) of a text.
Don't stop in the middle of [Code], [Verbatim], [List], [Lnum],
--
2.17.1
|