1 # Built-in strip corrupts binaries, so use the mingw32 strip instead:
2 %define __strip %{_mingw32_strip}
3 %define __objdump %{_mingw32_objdump}
5 %define debug_package %{nil}
7 %define otherlibraries win32unix str num dynlink bigarray systhreads win32graph
12 Summary: Objective Caml MinGW cross-compiler and programming environment
14 License: QPL and (LGPLv2+ with exceptions)
15 Group: Development/Libraries
17 URL: http://caml.inria.fr/
18 Source0: http://caml.inria.fr/pub/distrib/ocaml-3.11/ocaml-%{version}.tar.bz2
20 # This is installed as config/Makefile when we cross-compile.
21 Source1000: Makefile-fedora-mingw.in
23 # XXX We should apply any Fedora native patches here.
25 # For patch description, see the top of each patch file.
26 # Start numbering at 1000 since these are MinGW-specific patches.
27 Patch1000: mingw32-ocaml-3.11.0+beta1-combined-Makefile.patch
28 Patch1001: mingw32-ocaml-3.11.0+beta1-disable-cmxs.patch
29 Patch1002: mingw32-ocaml-3.11.0+beta1-filename-win32-dirsep.patch
30 Patch1003: mingw32-ocaml-3.11.0+beta1-i386-profiling.patch
31 Patch1004: mingw32-ocaml-3.11.0+beta1-no-stdlib-dir.patch
32 Patch1005: mingw32-ocaml-3.11.0+beta1-win32-fixes.patch
33 Patch1006: mingw32-ocaml-3.11.0+beta1-win32unix-path.patch
35 BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
37 # Answer: yes and no. In theory it should be, but because we install
38 # Windows binaries in %{_libdir}, the path is different if built on
39 # 32 and 64 bit platforms. We should probably install the binaries
43 BuildRequires: mingw32-filesystem >= 30
44 BuildRequires: mingw32-gcc
45 BuildRequires: mingw32-binutils
46 BuildRequires: mingw32-flexdll
48 # These are required so we can use gcc -m32 and link to 32 bit X11:
49 BuildRequires: /lib/libgcc_s.so.1
50 BuildRequires: /usr/lib/crt1.o
51 BuildRequires: /usr/lib/libX11.so
53 # While we still ship bytecode, this requires a /usr/bin/ocamlrun from
54 # the _identical_ native package. We don't have that at the moment,
55 # which is why this is commented out.
56 #Requires: ocaml-runtime = %{version}
58 # The built program will try to run the cross-compiler and flexdll, so
59 # these must be runtime requires.
61 Requires: mingw32-binutils
62 Requires: mingw32-flexdll
64 # i686-pc-mingw32-ocamlmklib tries to run ocamlopt which is probably a
65 # bug, but requires this (XXX).
70 Objective Caml is a high-level, strongly-typed, functional and
71 object-oriented programming language from the ML family of languages.
73 This package is an OCaml cross-compiler which runs natively on Fedora
74 and produces Windows native executables.
78 %setup -q -n ocaml-%{version}
90 # Don't run out of memory.
93 # Build native ocamlrun and ocamlc which contain the
94 # filename-win32-dirsep patch.
96 # Note that we must build a 32 bit compiler, even on 64 bit build
97 # architectures, because this compiler will try to do strength
98 # reduction optimizations using its internal int type, and that must
99 # match Windows' int type. (That's what -cc and -host are for).
103 -libdir %{_libdir}/ocaml \
104 -mandir %{_mandir}/man1 \
105 -cc "gcc -m32" -host i386-pc-linux -x11lib /usr/lib -verbose
108 # Now move the working ocamlrun, ocamlc into the boot/ directory,
109 # overwriting the binary versions which ship with the compiler with
110 # ones that contain the above filename-win32-dirsep patch.
113 # Now replace the compiler configuration (config/{s.h,m.h,Makefile})
114 # with ones as they would be on a 32 bit Windows system.
117 # config/m.h can just be copied from config/m-nt.h which ships.
121 # config/s.h can just be copied from config/s-nt.h which ships.
125 # config/Makefile is a custom one which we supply.
128 -e 's,@prefix@,%{_prefix},g' \
129 -e 's,@bindir@,%{_bindir},g' \
130 -e 's,@libdir@,%{_libdir},g' \
131 -e 's,@target@,%{_mingw32_target},g' \
132 -e 's,@otherlibraries@,%{otherlibraries},g' \
133 < %{SOURCE1000} > Makefile
137 # We're going to build in otherlibs/win32unix and otherlibs/win32graph
138 # directories, but since they would normally only be built under
139 # Windows, they only have the Makefile.nt files. Just symlink
140 # Makefile -> Makefile.nt for these cases.
141 for d in otherlibs/win32unix otherlibs/win32graph; do
142 ln -s Makefile.nt $d/Makefile
145 # Now clean the temporary files from the previous build. This
146 # will also cause asmcomp/arch.ml (etc) to be linked to the 32 bit
147 # i386 versions, essentially causing ocamlopt to use the Win/i386 code
151 # Just rebuild some small bits that we need for the following
152 # 'make opt' to work. Note that 'make all' fails here.
153 make -C byterun libcamlrun.a
156 make -C tools ocamlmklib
163 rm -rf $RPM_BUILD_ROOT
165 mkdir -p $RPM_BUILD_ROOT%{_bindir}
166 mkdir -p $RPM_BUILD_ROOT%{_libdir}/%{_mingw32_target}-ocaml
167 mkdir -p $RPM_BUILD_ROOT%{_libdir}/%{_mingw32_target}-ocaml/threads
168 mkdir -p $RPM_BUILD_ROOT%{_libdir}/%{_mingw32_target}-ocaml/stublibs
170 # This is the equivalent of 'make install installopt', but
171 # we only want to install the parts which are really necessary
172 # for the cross-compiler. eg. We don't need any of the native
173 # tools like ocamllex or ocamldoc.
174 %define makevars BINDIR=$RPM_BUILD_ROOT%{_bindir} LIBDIR=$RPM_BUILD_ROOT%{_libdir}/%{_mingw32_target}-ocaml
175 make %{makevars} -C byterun install
176 make %{makevars} -C stdlib install
177 for i in %{otherlibraries}; do
178 make %{makevars} -C otherlibs/$i install
180 make %{makevars} -C tools install
181 make %{makevars} installopt
183 install -m 0755 ocamlc $RPM_BUILD_ROOT%{_bindir}
186 $RPM_BUILD_ROOT%{_libdir}/%{_mingw32_target}-ocaml/Makefile.config
188 # For bytecode binaries, change the bang-path to point to the locally
189 # installed ocamlrun.
190 pushd $RPM_BUILD_ROOT%{_bindir}
191 for f in ocamlc ocamlcp ocamldep ocamlmklib ocamlopt ocamlprof; do
193 echo '#!%{_bindir}/%{_mingw32_target}-ocamlrun' > $f
194 tail -n +2 $f.old >> $f
200 # Rename all the binaries to target-binary.
201 pushd $RPM_BUILD_ROOT%{_bindir}
202 for f in ocamlc ocamlcp ocamldep ocamlmklib ocamlmktop ocamlopt ocamlprof ocamlrun; do
203 mv $f %{_mingw32_target}-$f
209 rm -rf $RPM_BUILD_ROOT
213 %defattr(-,root,root)
214 %{_bindir}/%{_mingw32_target}-ocamlc
215 %{_bindir}/%{_mingw32_target}-ocamlcp
216 %{_bindir}/%{_mingw32_target}-ocamldep
217 %{_bindir}/%{_mingw32_target}-ocamlmklib
218 %{_bindir}/%{_mingw32_target}-ocamlmktop
219 %{_bindir}/%{_mingw32_target}-ocamlprof
220 %{_bindir}/%{_mingw32_target}-ocamlopt
221 %{_bindir}/%{_mingw32_target}-ocamlrun
222 %{_libdir}/%{_mingw32_target}-ocaml/
226 * Sun Nov 16 2008 Richard W.M. Jones <rjones@redhat.com> - 3.11.0+beta1-13
227 - Build the native compiler as 32 bits even on a 64 bit build
228 architecture (because the target, Windows, is 32 bit). The
229 compiler does strength reduction and other optimizations
230 internally so we must ensure it uses the same int type.
231 - Requires libX11-devel.i386 and libgcc.i386.
232 - Allow the normal dependency generators to run because this
234 - Use mingw32 strip to avoid corrupting binaries.
236 * Sun Nov 16 2008 Richard W.M. Jones <rjones@redhat.com> - 3.11.0+beta1-8
239 * Sat Nov 15 2008 Richard W.M. Jones <rjones@redhat.com> - 3.11.0+beta1-7
240 - Further requirements.
242 * Sat Nov 15 2008 Richard W.M. Jones <rjones@redhat.com> - 3.11.0+beta1-6
243 - Install tools, particularly ocamlmklib.
245 * Sat Nov 15 2008 Richard W.M. Jones <rjones@redhat.com> - 3.11.0+beta1-5
246 - +Requires mingw32-flexdll and the cross-compiler.
248 * Sat Nov 15 2008 Richard W.M. Jones <rjones@redhat.com> - 3.11.0+beta1-4
249 - Initial RPM release.