]> git.pld-linux.org Git - packages/ocaml.git/blob - ocaml.spec
- tabs in preamble
[packages/ocaml.git] / ocaml.spec
1 #
2 # Conditional build:
3 %bcond_without  emacs   # without emacs subpackage
4 %bcond_without  x       # without X11 support 
5 %bcond_without  tk      # without Tcl/Tk support
6 #
7 # --without x11 implies --without tk
8 %{!?with_x:%undefine    with_tk}
9
10 %define         p4ver   3.06
11 %define         sver    3.09
12
13 Summary:        The Objective Caml compiler and programming environment
14 Summary(pl.UTF-8):      Kompilator OCamla (Objective Caml) oraz środowisko programistyczne
15 Name:           ocaml
16 Version:        3.09.3
17 Release:        1
18 Epoch:          1
19 License:        distributable
20 Vendor:         Group of implementors <caml-light@inria.fr>
21 Group:          Development/Languages
22 Source0:        http://caml.inria.fr/distrib/%{name}-%{sver}/%{name}-%{version}.tar.bz2
23 # Source0-md5:  8b3744efd0d51b82d55b61d0e2bf0e2b
24 Source1:        http://caml.inria.fr/distrib/%{name}-%{sver}/%{name}-%{sver}-refman.html.tar.gz
25 # Source1-md5:  b25eb211bf91bcaa536b12d12731ceec
26 Source2:        http://caml.inria.fr/distrib/%{name}-%{sver}/%{name}-%{sver}-refman.ps.gz
27 # Source2-md5:  598bb8e86329afe1ae374385b2e177e7
28 Source3:        ftp://ftp.inria.fr/INRIA/Projects/cristal/camlp4/camlp4-%{p4ver}-manual.html.tar.gz
29 # Source3-md5:  21370bae4e7f6435b38aeb21db7ce8bb
30 Source4:        ftp://ftp.inria.fr/INRIA/Projects/cristal/camlp4/camlp4-%{p4ver}-manual.dvi.gz
31 # Source4-md5:  035915d1a530aa7ec9b194d9a7d258eb
32 Source5:        ftp://ftp.inria.fr/INRIA/Projects/cristal/camlp4/camlp4-%{p4ver}-tutorial.html.tar.gz
33 # Source5-md5:  96d8eb4ca5abd58c9a280ba59f73b192
34 Source6:        ftp://ftp.inria.fr/INRIA/Projects/cristal/camlp4/camlp4-%{p4ver}-tutorial.dvi.gz
35 # Source6-md5:  fcd87c235109364242a0c9ccf176dff8
36 Source7:        http://www.ocaml.info/ocaml_sources/pure-fun-1.0.6.tar.bz2
37 # Source7-md5:  94eac3fa1ac51b8ada344b04839cb43c
38 Source8:        http://www.ocaml.info/ocaml_sources/ds-contrib.tar.gz
39 # Source8-md5:  77fa1da7375dea1393cc0b6cd802d7e1
40 Source9:        http://caml.inria.fr/distrib/%{name}-%{sver}/%{name}-%{sver}-refman.info.tar.gz
41 # Source9-md5:  280160b1fc7c8513074c3fda0446de29
42 Patch0:         %{name}-build.patch
43 Patch1:         %{name}-db3.patch
44 Patch2:         %{name}-objinfo.patch
45 Patch3:         %{name}-tk85support.patch
46 Patch4:         %{name}-CFLAGS.patch
47 Patch5:         %{name}-as_needed.patch
48 URL:            http://caml.inria.fr/
49 BuildRequires:  db-devel >= 4.1
50 %{?with_tk:BuildRequires:       tk-devel}
51 %{?with_x:BuildRequires:        xorg-lib-libX11-devel}
52 %if %{with emacs}
53 BuildRequires:  sed >= 4.0
54 BuildRequires:  xemacs
55 BuildRequires:  xemacs-common
56 BuildRequires:  xemacs-fsf-compat-pkg
57 %endif
58 Requires:       %{name}-runtime = %{epoch}:%{version}-%{release}
59 Provides:       ocaml-ocamldoc
60 Obsoletes:      ocaml-ocamldoc
61 BuildRoot:      %{tmpdir}/%{name}-%{version}-root-%(id -u -n)
62
63 %define         specflags       -fno-strict-aliasing
64
65 %description
66 Objective Caml is a high-level, strongly-typed, functional and
67 object-oriented programming language from the ML family of languages.
68
69 This package comprises two batch compilers (a fast bytecode compiler
70 and an optimizing native-code compiler), an interactive toplevel
71 system, Lex&Yacc tools, a replay debugger, and a comprehensive
72 library.
73
74 %description -l pl.UTF-8
75 OCaml (Objective Caml) jest funkcyjnym, obiektowo zorientowanym językiem
76 wysokiego poziomu z silnym typowaniem. Należy do rodziny języków ML.
77
78 Ten pakiet zawiera dwa kompilatory (szybki kompilator do bajtkodu
79 oraz optymalizujący kompilator do kodu natywnego), interaktywne środowisko
80 pracy, narzędzia do tworzenia analizatorów leksykalnych oraz składniowych
81 (ocamllex, ocamlyacc), odpluskwiacz (ocamldebug) i biblioteki.
82
83 %package runtime
84 Summary:        Runtime system for OCaml
85 Summary(pl.UTF-8):      Środowisko uruchomieniowe dla OCamla
86 Group:          Libraries
87
88 %description runtime
89 This package contains binaries needed to run bytecode OCaml programs:
90 ocamlrun bytecode interpreter, and basic dynamic link libraries.
91
92 %description runtime -l pl.UTF-8
93 Pakiet ten zawiera binaria potrzebne do uruchamiania programów w
94 OCamlu skompilowanych do bajtkodu: interpreter bajtkodu (ocamlrun) oraz
95 podstawowe biblioteki linkowane dynamicznie.
96
97 %package lib-source
98 Summary:        Sources of OCaml standard library
99 Summary(pl.UTF-8):      Źródła biblioteki standardowej OCamla
100 Group:          Development/Languages
101 Requires:       %{name} = %{epoch}:%{version}-%{release}
102
103 %description lib-source
104 This sources come helpful during debugging of user programs with ocamldebug.
105
106 %description lib-source -l pl.UTF-8
107 Źródła te są przydatne przy odpluskwianiu programów użytkownika
108 z użyciem ocamldebug.
109
110 %package doc-html
111 Summary:        HTML documentation for OCaml
112 Summary(pl.UTF-8):      Dokumentacja dla OCamla w formacie HTML
113 Group:          Development/Tools
114
115 %description doc-html
116 HTML documentation for OCaml.
117
118 %description doc-html -l pl.UTF-8
119 Dokumentacja dla OCamla w formacie HTML.
120
121 %package doc-ps
122 Summary:        PostScript documentation for OCaml
123 Summary(pl.UTF-8):      Dokumentacja dla OCamla w formacie PostScript
124 Group:          Development/Tools
125
126 %description doc-ps
127 PostScript documentation for OCaml.
128
129 %description doc-ps -l pl.UTF-8
130 Dokumentacja dla OCamla w formacie PostScript.
131
132 %package doc-info
133 Summary:        Info documentation for OCaml
134 Summary(pl.UTF-8):      Dokumentacja info dla OCamla
135 Group:          Development/Tools
136
137 %description doc-info
138 Info documentation for OCaml.
139
140 %description doc-info -l pl.UTF-8
141 Dokumentacja info dla OCamla.
142
143 %package emacs
144 Summary:        Emacs mode for OCaml
145 Summary(pl.UTF-8):      Tryb OCamla dla Emacsa
146 Group:          Development/Tools
147 Requires:       %{name} = %{epoch}:%{version}-%{release}
148
149 %description emacs
150 Emacs mode files for Objective Caml language.
151
152 %description emacs -l pl.UTF-8
153 Pliki trybu OCamla dla Emacsa.
154
155 %package labltk
156 Summary:        Runtime for LablTk library
157 Summary(pl.UTF-8):      Środowisko uruchomieniowe dla biblioteki LablTk
158 Group:          Libraries
159 Requires:       %{name} = %{epoch}:%{version}-%{release}
160
161 %description labltk
162 LablTk gives OCaml program access to Tcl/Tk GUI widgets. This package
163 contains files needed to run bytecode OCaml programs using LablTk.
164
165 %description labltk -l pl.UTF-8
166 Biblioteka LablTk daje programom napisanym w OCamlu dostęp do widgetów
167 Tcl/Tk. Pakiet ten zawiera binaria potrzebne do uruchamiania programów
168 używających LablTk.
169
170 %package labltk-devel
171 Summary:        LablTk library for OCaml
172 Summary(pl.UTF-8):      Biblioteka LablTk dla OCamla
173 Group:          Development/Libraries
174 Requires:       %{name}-labltk = %{epoch}:%{version}-%{release}
175
176 %description labltk-devel
177 LablTk gives OCaml program access to Tcl/Tk GUI widgets. This package
178 contains files needed to develop OCaml programs using LablTk.
179
180 %description labltk-devel -l pl.UTF-8
181 Biblioteka LablTk daje programom napisanym w OCamlu dostęp do widgetów
182 Tcl/Tk. Pakiet ten zawiera pliki niezbędne do tworzenia programów
183 używających LablTk.
184
185 %package x11graphics
186 Summary:        X11 graphic output for OCaml
187 Summary(pl.UTF-8):      Dostęp do X11 dla OCamla
188 Group:          Development/Libraries
189 Requires:       %{name} = %{epoch}:%{version}-%{release}
190
191 %description x11graphics
192 x11graphics module gives OCaml program access to drawing in X11
193 windows. This package contains files needed to run bytecode OCaml
194 programs using x11graphics.
195
196 %description x11graphics -l pl.UTF-8
197 Moduł x11graphics daje programom napisanym w OCamlu możliwość
198 korzystania z interfejsu graficznego X11. Pakiet ten zawiera binaria
199 potrzebne do uruchamiania programów używających x11graphics.
200
201 %package x11graphics-devel
202 Summary:        X11 graphic output for OCaml
203 Summary(pl.UTF-8):      Dostęp do X11 dla OCamla
204 Group:          Development/Libraries
205 Requires:       %{name}-x11graphics = %{epoch}:%{version}-%{release}
206
207 %description x11graphics-devel
208 x11graphics module gives OCaml program access to drawing in X11
209 windows. This package contains files needed to develop OCaml programs
210 using x11graphics.
211
212 %description x11graphics-devel -l pl.UTF-8
213 Moduł x11graphics daje programom napisanym w OCamlu możliwość
214 korzystania z interfejsu graficznego X11. Pakiet ten zawiera pliki
215 niezbędne do tworzenia programów używających x11graphics.
216
217 %package camlp4
218 Summary:        Objective Caml Preprocessor
219 Summary(pl.UTF-8):      Preprocesor OCamla
220 Group:          Development/Languages
221 Requires:       %{name} = %{epoch}:%{version}-%{release}
222 Provides:       camlp4 = %{epoch}:%{version}-%{release}
223 Obsoletes:      camlp4
224
225 %description camlp4
226 Camlp4 is a Pre-Processor-Pretty-Printer for Objective Caml. It offers
227 tools for syntax (grammars) and the ability to modify the concrete
228 syntax of the language (quotations, syntax extensions).
229
230 Camlp4 can parse normal Ocaml concrete syntax or any other
231 user-definable syntax. As an example, an alternative syntax is
232 provided, named revised, because it tries to fix some small problems
233 of the normal syntax.
234
235 Camlp4 can pretty print the normal Ocaml concrete syntax or the
236 revised one. It is therefore always possible to have a version of your
237 sources compilable by the Objective Caml compiler without
238 preprocessing.
239
240 %description camlp4 -l pl.UTF-8
241 Camlp4 jest preprocesorem OCamla. Oferuje narzędzia do manipulowania
242 składnią (gramatyki) oraz możliwość modyfikowania oryginalnej składni
243 języka (cytowania, rozszerzenia).
244
245 Camlp4 może sparsować oryginalną składnię Ocamla lub dowolną inną
246 definiowalną przez użytkownika. Jako przykład podana jest alternatywna
247 składnia (revised syntax), która próbuje poprawić drobne problemy
248 występujące w składni oryginalnej.
249
250 Camlp4 umie ładnie formatować źródła zarówno w oryginalnej jak i
251 poprawionej składni OCamla. Potrafi także tłumaczyć programy z jednej
252 składni na drugą.
253
254 %package camlp4-doc-html
255 Summary:        Objective Caml Preprocessor - HTML documentation 
256 Summary(pl.UTF-8):      Preprocesor OCamla - dokumentacja HTML 
257 Group:          Development/Languages
258
259 %description camlp4-doc-html
260 Objective Caml Preprocessor - HTML documentation.
261
262 %description camlp4-doc-html -l pl.UTF-8
263 Preprocesor OCamla - dokumentacja HTML.
264
265 %package compiler-objects
266 Summary:        Compiled parts of OCaml compiler
267 Summary(pl.UTF-8):      Skompilowane części kompilatora OCamla
268 Group:          Development/Languages
269 Requires:       %{name} = %{epoch}:%{version}-%{release}
270 Obsoletes:      ocaml-devel
271 Provides:       ocaml-devel
272
273 %description compiler-objects
274 This package contains *.cmi and *.cmo files being parts of OCaml
275 compiler. They are needed to compile some programs.
276
277 %description compiler-objects -l pl.UTF-8
278 Pakiet ten zawiera pliki *.cmi oraz *.cmo będące częściami kompilatora
279 OCamla. Są one wymagane do kompilacji niektórych programów.
280
281 %package ocamldoc-devel
282 Summary:        Files needed to develop programs using ocamldoc
283 Summary(pl.UTF-8):      Pliki potrzebne do tworzenia programów używających ocamldoc
284 Group:          Development/Languages
285 Requires:       %{name} = %{epoch}:%{version}-%{release}
286
287 %description ocamldoc-devel
288 You need this package if you are going to write ocamldoc front end or
289 something like that.
290
291 %description ocamldoc-devel -l pl.UTF-8
292 Będziesz potrzebować tego pakietu, jeśli zamierzasz pisać front end
293 dla ocamldoc lub coś podobnego.
294
295 # maybe we'll want to add some more stuff here?
296 %package examples
297 Summary:        Example source code for OCaml
298 Summary(pl.UTF-8):      Przykładowe kody źródłowe w OCamlu
299 Group:          Development/Languages
300 Requires:       %{name} = %{epoch}:%{version}-%{release}
301
302 %description examples
303 This packages contains sources for Okasaki's Purely Functional
304 Datastructures in OCaml, along with some contributions.
305
306 %description examples -l pl.UTF-8
307 Pakiet ten zawiera źródła Czysto Funkcyjnych Struktur Danych
308 autorstwa Okasaki'ego, napisane w OCamlu, wraz z dodatkami.
309
310 %prep
311 %setup -q -a1 -a3 -a5  
312 mkdir examples
313 tar xjf %{SOURCE7} -C examples
314 tar xzf %{SOURCE8} -C examples
315 tar xzf %{SOURCE9}
316 # order mess with docs somewhat
317 mkdir -p docs/html
318 mv htmlman docs/html/ocaml
319 cp %{SOURCE2} docs/ocaml.ps.gz
320 mv camlp4-%{p4ver}-manual.html docs/html/camlp4
321 cp %{SOURCE4} docs/camlp4.ps.gz
322 mv camlp4-%{p4ver}-tutorial.html docs/html/camlp4-tutorial
323 cp %{SOURCE6} docs/camlp4-tutorial.ps.gz
324 %patch0 -p1
325 %patch1 -p1
326 %patch2 -p1
327 %patch3 -p1
328 %patch4 -p1
329 %patch5 -p1
330
331 %build 
332 cp -f /usr/share/automake/config.sub config/gnu
333 ./configure \
334         -cc "%{__cc}" \
335         -bindir %{_bindir} \
336         -libdir %{_libdir}/%{name} \
337         -mandir %{_mandir}/man1 \
338         -host %{_host} \
339         %{!?with_tk:-no-tk} \
340         -with-pthread \
341         -x11lib %{_libdir}
342
343 %{__make} -j1 world bootstrap opt.opt CFLAGS="%{rpmcflags} -Wall"
344 %{__make} -C tools objinfo CFLAGS="%{rpmcflags} -Wall" -j1
345
346 %install
347 rm -rf $RPM_BUILD_ROOT
348 install -d $RPM_BUILD_ROOT{%{_includedir},%{_infodir},%{_examplesdir}/%{name}-{labltk-,}%{version}}
349
350 %{__make} install \
351         BINDIR=$RPM_BUILD_ROOT%{_bindir} \
352         LIBDIR=$RPM_BUILD_ROOT%{_libdir}/%{name} \
353         MANDIR=$RPM_BUILD_ROOT%{_mandir}
354
355 cat > $RPM_BUILD_ROOT%{_libdir}/%{name}/ld.conf <<EOF
356 %{_libdir}/%{name}/stublibs
357 %{_libdir}/%{name}
358 EOF
359
360 %if %{with emacs}
361 %{__make} -C emacs DESTDIR=$RPM_BUILD_ROOT install \
362         EMACS="`if [ -x %{_bindir}/emacs ]; then echo emacs; \
363                 else echo xemacs; fi`" \
364         EMACSDIR="$RPM_BUILD_ROOT%{_datadir}/emacs/site-lisp"
365 %endif
366
367 # symlink .opt versions of compilers (if present)
368 # warning: don't do that with camlp4 (can't load extensions then)
369 for f in ocamlc ocamlopt ocamldoc ocamllex; do
370         if test -f $RPM_BUILD_ROOT%{_bindir}/$f.opt; then
371                 mv -f $RPM_BUILD_ROOT%{_bindir}/$f \
372                         $RPM_BUILD_ROOT%{_bindir}/$f.byte
373                 ln -sf %{_bindir}/$f.opt $RPM_BUILD_ROOT%{_bindir}/$f
374         fi
375 done
376
377 # move includes to the proper place
378 mv -f $RPM_BUILD_ROOT%{_libdir}/%{name}/caml $RPM_BUILD_ROOT%{_includedir}/caml
379 # but leave compatibility symlink
380 ln -s ../../include/caml $RPM_BUILD_ROOT%{_libdir}/%{name}/caml
381
382 # compiled sources of compiler, needed by some programs
383 for f in {asm,byte}comp parsing typing utils ; do
384         install -d $RPM_BUILD_ROOT%{_libdir}/%{name}/compiler/$f
385         cp $f/*.{cmi,cmo,cmx,o} $RPM_BUILD_ROOT%{_libdir}/%{name}/compiler/$f
386 done
387
388 # this isn't installed by default, but is useful
389 install tools/objinfo $RPM_BUILD_ROOT%{_bindir}/ocamlobjinfo
390 cp -r examples/* $RPM_BUILD_ROOT%{_examplesdir}/%{name}-%{version}
391 cp -r otherlibs/labltk/examples* $RPM_BUILD_ROOT%{_examplesdir}/%{name}-labltk-%{version}
392 ln -sf %{_libdir}/%{name}/{scrape,add}labels $RPM_BUILD_ROOT%{_bindir}
393
394 # shutup checkfiles
395 rm -rf $RPM_BUILD_ROOT%{_mandir}/man3
396 rm -f $RPM_BUILD_ROOT%{_libdir}/%{name}/labltk/{labltktop,pp}
397
398 # install info pages
399 cp -f infoman/*.gz $RPM_BUILD_ROOT%{_infodir}
400
401 %clean
402 rm -rf $RPM_BUILD_ROOT
403
404 %post doc-info
405 [ ! -x /usr/sbin/fix-info-dir ] || /usr/sbin/fix-info-dir -c %{_infodir} >/dev/null 2>&1
406
407 %postun doc-info
408 [ ! -x /usr/sbin/fix-info-dir ] || /usr/sbin/fix-info-dir -c %{_infodir} >/dev/null 2>&1
409
410 %files
411 %defattr(644,root,root,755)
412 %doc LICENSE Changes README Upgrading
413 %attr(755,root,root) %{_bindir}/ocaml*
414 %{!?_without_tk:%exclude %{_bindir}/ocamlbrowser}
415 %exclude %{_bindir}/ocamlrun
416 %attr(755,root,root) %{_bindir}/*labels
417 %{_includedir}/caml
418 %{_libdir}/%{name}/caml
419 %{_libdir}/%{name}/threads
420 %dir %{_libdir}/%{name}/vmthreads
421 %dir %{_libdir}/%{name}/vmthreads/*.cm*
422 %dir %{_libdir}/%{name}/vmthreads/*.a
423 %{_libdir}/%{name}/*.a
424 %{_libdir}/%{name}/*.o
425 %{_libdir}/%{name}/*.cm*
426 %exclude %{_libdir}/%{name}/*graphics*
427 %{_libdir}/%{name}/ld.conf
428 %{_libdir}/%{name}/camlheader
429 %{_libdir}/%{name}/camlheader_ur
430 %dir %{_libdir}/%{name}/ocamldoc
431 %{_libdir}/%{name}/ocamldoc/*.hva
432 %attr(755,root,root) %{_libdir}/%{name}/expunge
433 %attr(755,root,root) %{_libdir}/%{name}/extract_crc
434 %attr(755,root,root) %{_libdir}/%{name}/*labels
435 %{_mandir}/man1/*ocaml*
436
437 %files runtime
438 %defattr(644,root,root,755)
439 %attr(755,root,root) %{_bindir}/ocamlrun
440 %dir %{_libdir}/%{name}
441 %dir %{_libdir}/%{name}/stublibs
442 %attr(755,root,root) %{_libdir}/%{name}/stublibs/dll*.so
443 %exclude %{_libdir}/%{name}/stublibs/dllgraphics.so
444 %if %{with tk}
445 %exclude %{_libdir}/%{name}/stublibs/dlllabltk.so
446 %exclude %{_libdir}/%{name}/stublibs/dlltkanim.so
447 %endif
448
449 %files lib-source
450 %defattr(644,root,root,755)
451 %{_libdir}/%{name}/*.ml
452 %{_libdir}/%{name}/*.mli
453 %{_libdir}/%{name}/*/*.mli
454
455 %files doc-html
456 %defattr(644,root,root,755)
457 %doc docs/html/ocaml/*
458
459 %files doc-ps
460 %defattr(644,root,root,755)
461 %doc docs/*.ps.gz
462
463 %files doc-info
464 %defattr(644,root,root,755)
465 %{_infodir}/ocaml.info*
466
467 # they are poor, html is much better
468 #%files manpages
469 #%%{_mandir}/man3/*
470
471 %if %{with emacs}
472 %files emacs
473 %defattr(644,root,root,755)
474 %{_datadir}/emacs/site-lisp/*.el*
475 %endif
476
477 %if %{with tk}
478 %files labltk
479 %defattr(644,root,root,755)
480 %attr(755,root,root) %{_libdir}/%{name}/stublibs/dlllabltk.so
481 %attr(755,root,root) %{_libdir}/%{name}/stublibs/dlltkanim.so
482
483 %files labltk-devel
484 %defattr(644,root,root,755)
485 %attr(755,root,root) %{_bindir}/labltk
486 %attr(755,root,root) %{_bindir}/ocamlbrowser
487 %dir %{_libdir}/%{name}/labltk
488 %{_libdir}/%{name}/labltk/*.cm*
489 %{_libdir}/%{name}/labltk/*.a
490 %attr(755,root,root) %{_libdir}/%{name}/labltk/tkcompiler
491 %{_examplesdir}/%{name}-labltk-%{version}
492 %endif
493
494 %if %{with x}
495 %files x11graphics
496 %defattr(644,root,root,755)
497 %attr(755,root,root) %{_libdir}/%{name}/stublibs/dllgraphics.so
498
499 %files x11graphics-devel
500 %defattr(644,root,root,755)
501 %{_libdir}/%{name}/graphics*.cm*
502 %{_libdir}/%{name}/graphics.a
503 %{_libdir}/%{name}/libgraphics.a
504 %endif
505
506 %files camlp4
507 %defattr(644,root,root,755)
508 %attr(755,root,root) %{_bindir}/*camlp4*
509 %attr(755,root,root) %{_bindir}/ocpp
510 # Not installed since 3.05, is it needed?
511 #%attr(755,root,root) %{_bindir}/odyl
512 %{_libdir}/%{name}/camlp4
513 %{_mandir}/man*/*camlp4*
514 %{_mandir}/man*/*ocpp*
515
516 %files camlp4-doc-html
517 %defattr(644,root,root,755)
518 %doc docs/html/camlp4*
519
520 %files compiler-objects
521 %defattr(644,root,root,755)
522 %{_libdir}/%{name}/compiler
523
524 %files ocamldoc-devel
525 %defattr(644,root,root,755)
526 %{_libdir}/%{name}/ocamldoc/*.cm*
527 %{_libdir}/%{name}/ocamldoc/*.a
528
529 %files examples
530 %defattr(644,root,root,755)
531 %{_examplesdir}/%{name}-%{version}
This page took 0.106811 seconds and 4 git commands to generate.