- Build the native compiler as 32 bits even on a 64 bit build
[fedora-mingw.git] / ocaml / mingw32-ocaml.spec
1 #%define __strip %{_mingw32_strip}
2 #%define __objdump %{_mingw32_objdump}
3 %define __strip :
4 %define __objdump :
5 %define _use_internal_dependency_generator 0
6 %define __find_requires %{_mingw32_findrequires}
7 %define __find_provides %{_mingw32_findprovides}
8
9 %define debug_package %{nil}
10
11 %define otherlibraries win32unix str num dynlink bigarray systhreads win32graph
12
13 Name:           mingw32-ocaml
14 Version:        3.11.0+beta1
15 Release:        9%{?dist}
16 Summary:        Objective Caml MinGW cross-compiler and programming environment
17
18 License:        QPL and (LGPLv2+ with exceptions)
19 Group:          Development/Libraries
20
21 URL:            http://caml.inria.fr/
22 Source0:        http://caml.inria.fr/pub/distrib/ocaml-3.11/ocaml-%{version}.tar.bz2
23
24 # This is installed as config/Makefile when we cross-compile.
25 Source1000:     Makefile-fedora-mingw.in
26
27 # XXX We should apply any Fedora native patches here.
28
29 # For patch description, see the top of each patch file.
30 # Start numbering at 1000 since these are MinGW-specific patches.
31 Patch1000:      mingw32-ocaml-3.11.0+beta1-combined-Makefile.patch
32 Patch1001:      mingw32-ocaml-3.11.0+beta1-disable-cmxs.patch
33 Patch1002:      mingw32-ocaml-3.11.0+beta1-filename-win32-dirsep.patch
34 Patch1003:      mingw32-ocaml-3.11.0+beta1-i386-profiling.patch
35 Patch1004:      mingw32-ocaml-3.11.0+beta1-no-stdlib-dir.patch
36 Patch1005:      mingw32-ocaml-3.11.0+beta1-win32-fixes.patch
37 Patch1006:      mingw32-ocaml-3.11.0+beta1-win32unix-path.patch
38
39 BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
40 # Is it noarch? (XXX)
41 BuildArch:      noarch
42
43 BuildRequires:  mingw32-filesystem >= 30
44 BuildRequires:  mingw32-gcc
45 BuildRequires:  mingw32-binutils
46 BuildRequires:  mingw32-flexdll
47
48 BuildRequires:  /usr/lib/libX11.so
49
50 # While we still ship bytecode, this requires a /usr/bin/ocamlrun from
51 # the _identical_ native package.  We don't have that at the moment,
52 # which is why this is commented out.
53 #Requires:       ocaml-runtime = %{version}
54
55 # The built program will try to run the cross-compiler and flexdll, so
56 # these must be runtime requires.
57 Requires:       mingw32-gcc
58 Requires:       mingw32-binutils
59 Requires:       mingw32-flexdll
60
61 # i686-pc-mingw32-ocamlmklib tries to run ocamlopt which is probably a
62 # bug, but requires this (XXX).
63 Requires:       ocaml
64
65
66 %description
67 Objective Caml is a high-level, strongly-typed, functional and
68 object-oriented programming language from the ML family of languages.
69
70 This package is an OCaml cross-compiler which runs natively on Fedora
71 and produces Windows native executables.
72
73
74 %prep
75 %setup -q -n ocaml-%{version}
76
77 %patch1000 -p1
78 %patch1001 -p1
79 %patch1002 -p1
80 %patch1003 -p1
81 %patch1004 -p1
82 %patch1005 -p1
83 %patch1006 -p0
84
85
86 %build
87 # Don't run out of memory.
88 ulimit -s unlimited
89
90 # Build native ocamlrun and ocamlc which contain the
91 # filename-win32-dirsep patch.
92 #
93 # Note that we must build a 32 bit compiler, even on 64 bit build
94 # architectures, because this compiler will try to do strength
95 # reduction optimizations using its internal int type, and that must
96 # match Windows' int type.  (That's what -cc and -host are for).
97 ./configure \
98   -no-tk \
99   -bindir %{_bindir} \
100   -libdir %{_libdir}/ocaml \
101   -mandir %{_mandir}/man1 \
102   -cc "gcc -m32" -host i386-pc-linux -x11lib /usr/lib
103 make world
104
105 # Now move the working ocamlrun, ocamlc into the boot/ directory,
106 # overwriting the binary versions which ship with the compiler with
107 # ones that contain the above filename-win32-dirsep patch.
108 make coreboot
109
110 # Now replace the compiler configuration (config/{s.h,m.h,Makefile})
111 # with ones as they would be on a 32 bit Windows system.
112 pushd config
113
114 # config/m.h can just be copied from config/m-nt.h which ships.
115 rm -f m.h
116 cp m-nt.h m.h
117
118 # config/s.h can just be copied from config/s-nt.h which ships.
119 rm -f s.h
120 cp s-nt.h s.h
121
122 # config/Makefile is a custom one which we supply.
123 rm -f Makefile
124 sed \
125   -e 's,@prefix@,%{_prefix},g' \
126   -e 's,@bindir@,%{_bindir},g' \
127   -e 's,@libdir@,%{_libdir},g' \
128   -e 's,@target@,%{_mingw32_target},g' \
129   -e 's,@otherlibraries@,%{otherlibraries},g' \
130   < %{SOURCE1000} > Makefile
131
132 popd
133
134 # We're going to build in otherlibs/win32unix and otherlibs/win32graph
135 # directories, but since they would normally only be built under
136 # Windows, they only have the Makefile.nt files.  Just symlink
137 # Makefile -> Makefile.nt for these cases.
138 for d in otherlibs/win32unix otherlibs/win32graph; do
139   ln -s Makefile.nt $d/Makefile
140 done
141
142 # Now clean the temporary files from the previous build.  This
143 # will also cause asmcomp/arch.ml (etc) to be linked to the 32 bit
144 # i386 versions, essentially causing ocamlopt to use the Win/i386 code
145 # generator.
146 make partialclean
147
148 # Just rebuild some small bits that we need for the following
149 # 'make opt' to work.  Note that 'make all' fails here.
150 make -C byterun libcamlrun.a
151 make ocaml ocamlc
152 make -C stdlib
153 make -C tools ocamlmklib
154
155 # Build ocamlopt
156 make opt
157
158
159 %install
160 rm -rf $RPM_BUILD_ROOT
161
162 mkdir -p $RPM_BUILD_ROOT%{_bindir}
163 mkdir -p $RPM_BUILD_ROOT%{_libdir}/%{_mingw32_target}-ocaml
164 mkdir -p $RPM_BUILD_ROOT%{_libdir}/%{_mingw32_target}-ocaml/threads
165 mkdir -p $RPM_BUILD_ROOT%{_libdir}/%{_mingw32_target}-ocaml/stublibs
166
167 # This is the equivalent of 'make install installopt', but
168 # we only want to install the parts which are really necessary
169 # for the cross-compiler.  eg. We don't need any of the native
170 # tools like ocamllex or ocamldoc.
171 %define makevars BINDIR=$RPM_BUILD_ROOT%{_bindir} LIBDIR=$RPM_BUILD_ROOT%{_libdir}/%{_mingw32_target}-ocaml
172 make %{makevars} -C byterun install
173 make %{makevars} -C stdlib install
174 for i in %{otherlibraries}; do
175   make %{makevars} -C otherlibs/$i install
176 done
177 make %{makevars} -C tools install
178 make %{makevars} installopt
179
180 install -m 0755 ocamlc $RPM_BUILD_ROOT%{_bindir}
181
182 cp config/Makefile \
183    $RPM_BUILD_ROOT%{_libdir}/%{_mingw32_target}-ocaml/Makefile.config
184
185 # For bytecode binaries, change the bang-path to point to the locally
186 # installed ocamlrun.
187 pushd $RPM_BUILD_ROOT%{_bindir}
188 for f in ocamlc ocamlcp ocamldep ocamlmklib ocamlopt ocamlprof; do
189   mv $f $f.old
190   echo '#!%{_bindir}/%{_mingw32_target}-ocamlrun' > $f
191   tail -n +2 $f.old >> $f
192   chmod +x $f
193   rm $f.old
194 done
195 popd
196
197 # Rename all the binaries to target-binary.
198 pushd $RPM_BUILD_ROOT%{_bindir}
199 for f in ocamlc ocamlcp ocamldep ocamlmklib ocamlmktop ocamlopt ocamlprof ocamlrun; do
200   mv $f %{_mingw32_target}-$f
201 done
202 popd
203
204
205 %clean
206 rm -rf $RPM_BUILD_ROOT
207
208
209 %files
210 %defattr(-,root,root)
211 %{_bindir}/%{_mingw32_target}-ocamlc
212 %{_bindir}/%{_mingw32_target}-ocamlcp
213 %{_bindir}/%{_mingw32_target}-ocamldep
214 %{_bindir}/%{_mingw32_target}-ocamlmklib
215 %{_bindir}/%{_mingw32_target}-ocamlmktop
216 %{_bindir}/%{_mingw32_target}-ocamlprof
217 %{_bindir}/%{_mingw32_target}-ocamlopt
218 %{_bindir}/%{_mingw32_target}-ocamlrun
219 %{_libdir}/%{_mingw32_target}-ocaml/
220
221
222 %changelog
223 * Sun Nov 16 2008 Richard W.M. Jones <rjones@redhat.com> - 3.11.0+beta1-9
224 - Build the native compiler as 32 bits even on a 64 bit build
225   architecture (because the target, Windows, is 32 bit).  The
226   compiler does strength reduction and other optimizations
227   internally so we must ensure it uses the same int type.
228
229 * Sun Nov 16 2008 Richard W.M. Jones <rjones@redhat.com> - 3.11.0+beta1-8
230 - Install ocamlc.
231
232 * Sat Nov 15 2008 Richard W.M. Jones <rjones@redhat.com> - 3.11.0+beta1-7
233 - Further requirements.
234
235 * Sat Nov 15 2008 Richard W.M. Jones <rjones@redhat.com> - 3.11.0+beta1-6
236 - Install tools, particularly ocamlmklib.
237
238 * Sat Nov 15 2008 Richard W.M. Jones <rjones@redhat.com> - 3.11.0+beta1-5
239 - +Requires mingw32-flexdll and the cross-compiler.
240
241 * Sat Nov 15 2008 Richard W.M. Jones <rjones@redhat.com> - 3.11.0+beta1-4
242 - Initial RPM release.