File: rules

package info (click to toggle)
mingw-ocaml 3.12.1%2Bdebian3
  • links: PTS, VCS
  • area: main
  • in suites: wheezy
  • size: 4,000 kB
  • sloc: makefile: 158
file content (219 lines) | stat: -rwxr-xr-x 10,412 bytes parent folder | download
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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
#!/usr/bin/make -f

DEB_TAR_SRCDIR := .

MINGW_HOST := i686-w64-mingw32
FLEXDLL_DIR := flexdll
OCAML_DIR := ocaml-3.12.1
FINDLIB_DIR := findlib-1.2.5+debian
OTHER_LIBS := win32unix str num dynlink bigarray systhreads win32graph
INSTALL_PATH := $(CURDIR)/debian/mingw-ocaml
DEB_STRIP_EXCLUDE := $(MINGW_HOST)

include /usr/share/cdbs/1/rules/tarball.mk
include /usr/share/cdbs/1/rules/debhelper.mk
include /usr/share/cdbs/1/rules/patchsys-quilt.mk

stamp-build-flexdll:
	cd $(DEB_BUILDDIR)/$(FLEXDLL_DIR) && make TOOLCHAIN=mingw MINCC=$(MINGW_HOST)-gcc \
	                                         CC=$(MINGW_HOST)-gcc flexlink.exe build_mingw
	cd $(DEB_BUILDDIR)/$(FLEXDLL_DIR) && cp flexlink.exe flexlink
	touch stamp-build-flexdll

stamp-build-ocamlcore:
	# Build native ocamlrun and ocamlc which contain the
	# filename-win32-dirsep patch.
	#
	# Note that we must build a 32 bit compiler, even on 64 bit build
	# architectures, because this compiler will try to do strength
	# reduction optimizations using its internal int type, and that must
	# match Windows' int type.  (That's what -cc and -host are for).
	cd $(DEB_BUILDDIR)/$(OCAML_DIR) && ./configure \
	  -prefix /usr/$(MINGW_HOST) \
	  -bindir /usr/$(MINGW_HOST)/bin \
	  -libdir /usr/$(MINGW_HOST)/lib/ocaml \
	  -no-tk \
	  -cc "gcc -m32" -host $(MINGW_HOST) -x11lib /usr/lib -verbose
	cd $(DEB_BUILDDIR)/$(OCAML_DIR) && make world
	# Now move the working ocamlrun, ocamlc into the boot/ directory,
	# overwriting the binary versions which ship with the compiler with
	# ones that contain the filename-win32-dirsep patch.
	cd $(DEB_BUILDDIR)/$(OCAML_DIR) && make coreboot
	touch stamp-build-ocamlcore

stamp-patch-mingw-include:
	# Now patch utils/clflags.ml to hardcode mingw-specific include.
	patch -p0 < debian/patches/hardcode_mingw_include.patch
	touch stamp-patch-mingw-include

stamp-prepare-cross-build: stamp-patch-mingw-include
	# Replace the compiler configuration (config/{s.h,m.h,Makefile})
	# with ones as they would be on a 32 bit Windows system.
	cp -f $(DEB_BUILDDIR)/$(OCAML_DIR)/config/m-nt.h $(DEB_BUILDDIR)/$(OCAML_DIR)/config/m.h
	cp -f $(DEB_BUILDDIR)/$(OCAML_DIR)/config/s-nt.h $(DEB_BUILDDIR)/$(OCAML_DIR)/config/s.h
	# config/Makefile is a custom one which we supply.
	rm -f $(DEB_BUILDDIR)/$(OCAML_DIR)/config/Makefile
	sed \
	  -e "s,@prefix@,/usr/$(MINGW_HOST),g" \
	  -e "s,@bindir@,/usr/$(MINGW_HOST)/bin,g" \
	  -e "s,@libdir@,/usr/$(MINGW_HOST)/lib/ocaml,g" \
	  -e "s,@otherlibraries@,$(OTHER_LIBS),g" \
	  -e "s,@flexdir@,$(CURDIR)/$(DEB_BUILDDIR)/$(FLEXDLL_DIR),g" \
	  < debian/Makefile-mingw.in > $(DEB_BUILDDIR)/$(OCAML_DIR)/config/Makefile
	# We're going to build in otherlibs/win32unix and otherlibs/win32graph
	# directories, but since they would normally only be built under
	# Windows, they only have the Makefile.nt files.  Just symlink
	# Makefile -> Makefile.nt for these cases.
	for d in $(DEB_BUILDDIR)/$(OCAML_DIR)/otherlibs/win32unix \
	         $(DEB_BUILDDIR)/$(OCAML_DIR)/otherlibs/win32graph \
		 $(DEB_BUILDDIR)/$(OCAML_DIR)/otherlibs/bigarray \
		 $(DEB_BUILDDIR)/$(OCAML_DIR)/otherlibs/systhreads; do \
 	  ln -sf Makefile.nt $$d/Makefile; \
	done
	# Now clean the temporary files from the previous build.  This
	# will also cause asmcomp/arch.ml (etc) to be linked to the 32 bit
	# i386 versions, essentially causing ocamlopt to use the Win/i386 code
	# generator.
	cd $(DEB_BUILDDIR)/$(OCAML_DIR) && make partialclean
	# We need to remove any .o object for make sure they are
	# recompiled later..
	cd $(DEB_BUILDDIR)/$(OCAML_DIR) && rm byterun/*.o
	touch stamp-prepare-cross-build

stamp-build-mingw-ocaml:
	# Just rebuild some small bits that we need for the following
	# 'make opt' to work.  Note that 'make all' fails here.
	cd $(DEB_BUILDDIR)/$(OCAML_DIR) && make -C byterun libcamlrun.a
	cd $(DEB_BUILDDIR)/$(OCAML_DIR) && make ocaml ocamlc
	cd $(DEB_BUILDDIR)/$(OCAML_DIR) && make -C stdlib
	cd $(DEB_BUILDDIR)/$(OCAML_DIR) && make -C tools ocamlmklib
	# Build ocamlopt
	cd $(DEB_BUILDDIR)/$(OCAML_DIR) && PATH=$(CURDIR)/$(DEB_BUILDDIR)/$(FLEXDLL_DIR):$(PATH) \
	                                   make opt
	# Now build otherlibs for ocamlopt
	cd $(DEB_BUILDDIR)/$(OCAML_DIR) && \
	for i in $(OTHER_LIBS); do \
	  make -C otherlibs/$$i clean; \
	  PATH=$(CURDIR)/$(DEB_BUILDDIR)/$(FLEXDLL_DIR):$(PATH) \
	    make -C otherlibs/$$i all; \
	  PATH=$(CURDIR)/$(DEB_BUILDDIR)/$(FLEXDLL_DIR):$(PATH) \
	    make -C otherlibs/$$i allopt; \
	done
	touch stamp-build-mingw-ocaml

stamp-build-findlib:
	cd $(DEB_BUILDDIR)/$(FINDLIB_DIR)/tools/extract_args && make
	$(DEB_BUILDDIR)/$(FINDLIB_DIR)/tools/extract_args/extract_args \
	  -o $(DEB_BUILDDIR)/$(FINDLIB_DIR)/src/findlib/ocaml_args.ml \
	  $(INSTALL_PATH)/usr/bin/$(MINGW_HOST)-ocamlc \
	  $(INSTALL_PATH)/usr/bin/$(MINGW_HOST)-ocamlcp \
	  $(INSTALL_PATH)/usr/bin/$(MINGW_HOST)-ocamlmktop \
	  $(INSTALL_PATH)/usr/bin/$(MINGW_HOST)-ocamlopt \
	  $(INSTALL_PATH)/usr/bin/$(MINGW_HOST)-ocamldep 
	cd $(DEB_BUILDDIR)/$(FINDLIB_DIR) && ./configure \
	  -config /etc/$(MINGW_HOST)-ocamlfind.conf \
	  -bindir /usr/$(MINGW_HOST)/bin \
	  -sitelib /usr/$(MINGW_HOST)/lib/ocaml \
	  -mandir /usr/share/man \
	  -with-toolbox
	cd $(DEB_BUILDDIR)/$(FINDLIB_DIR) && make all
	cd $(DEB_BUILDDIR)/$(FINDLIB_DIR) && make opt
	touch stamp-build-findlib

build/mingw-ocaml:: stamp-build-flexdll \
		      stamp-build-ocamlcore \
		      stamp-prepare-cross-build \
		      stamp-build-mingw-ocaml \
		      $(INSTALL_PATH)/usr/bin/$(MINGW_HOST)-ocamlopt \
		      stamp-build-findlib

$(INSTALL_PATH)/usr/bin/$(MINGW_HOST)-ocamlopt:
	mkdir -p $(INSTALL_PATH)/usr/$(MINGW_HOST)/lib/ocaml/threads
	mkdir -p $(INSTALL_PATH)/usr/$(MINGW_HOST)/lib/ocaml/stublibs
	mkdir -p $(INSTALL_PATH)/usr/$(MINGW_HOST)/bin
	mkdir -p $(INSTALL_PATH)/usr/bin
	cd $(DEB_BUILDDIR)/$(OCAML_DIR) && make BINDIR=$(INSTALL_PATH)/usr/$(MINGW_HOST)/bin \
	                                        LIBDIR=$(INSTALL_PATH)/usr/$(MINGW_HOST)/lib/ocaml \
	                                        -C byterun install
	cd $(DEB_BUILDDIR)/$(OCAML_DIR) && make BINDIR=$(INSTALL_PATH)/usr/$(MINGW_HOST)/bin \
	                                        LIBDIR=$(INSTALL_PATH)/usr/$(MINGW_HOST)/lib/ocaml \
	                                        -C stdlib install
	cd $(DEB_BUILDDIR)/$(OCAML_DIR) && \
	for i in $(OTHER_LIBS); do \
	  make BINDIR=$(INSTALL_PATH)/usr/$(MINGW_HOST)/bin \
	       LIBDIR=$(INSTALL_PATH)/usr/$(MINGW_HOST)/lib/ocaml \
	       -C otherlibs/$$i install; \
	done
	cd $(DEB_BUILDDIR)/$(OCAML_DIR) && make BINDIR=$(INSTALL_PATH)/usr/$(MINGW_HOST)/bin \
	                                        LIBDIR=$(INSTALL_PATH)/usr/$(MINGW_HOST)/lib/ocaml \
	                                        -C tools install
	cd $(DEB_BUILDDIR)/$(OCAML_DIR) && make BINDIR=$(INSTALL_PATH)/usr/$(MINGW_HOST)/bin \
	                                        LIBDIR=$(INSTALL_PATH)/usr/$(MINGW_HOST)/lib/ocaml \
	                        installopt
	cd $(DEB_BUILDDIR)/$(OCAML_DIR) && install -m 0755 ocamlc $(INSTALL_PATH)/usr/$(MINGW_HOST)/bin
	cd $(DEB_BUILDDIR)/$(OCAML_DIR) && cp \
	  toplevel/topstart.cmo \
	  typing/outcometree.cmi typing/outcometree.mli \
	  toplevel/toploop.cmi toplevel/toploop.mli \
	  toplevel/topdirs.cmi toplevel/topdirs.mli \
 	  toplevel/topmain.cmi toplevel/topmain.mli \
	  $(INSTALL_PATH)/usr/$(MINGW_HOST)/lib/ocaml
	# Rename all the binaries to target-binary
	for f in ocamlc ocamlcp ocamlrun ocamldep ocamlmklib ocamlmktop ocamlopt ocamlprof; do \
	  mv $(INSTALL_PATH)/usr/$(MINGW_HOST)/bin/$$f $(INSTALL_PATH)/usr/bin/$(MINGW_HOST)-$$f; \
	done

install/mingw-ocaml::
	# Install findlib
	# Create this dir to please install..
	mkdir -p $(INSTALL_PATH)/usr/lib/ocaml
	cd $(DEB_BUILDDIR)/$(FINDLIB_DIR) && make install \
						prefix=$(INSTALL_PATH) 
	# Remove documentation which is already available
	# in the Debian native package.
	rm -r $(INSTALL_PATH)/usr/share/man
	# Symlink manuals for the cross-compiler binaries.
	for f in ocamlc ocamlcp ocamldep ocamlrun ocamlmklib ocamlmktop ocamlopt ocamlprof; do \
	  dh_link usr/share/man/man1/$$f.1.gz usr/share/man/man1/$(MINGW_HOST)-$$f.1.gz ; \
	done
	# Remove ocamlfind binary - we will use the native version.
	rm $(INSTALL_PATH)/usr/$(MINGW_HOST)/bin/ocamlfind
	# Remove findlib & num-top libs: if anything uses these we can
	# add them back later.
	rm -r $(INSTALL_PATH)/usr/$(MINGW_HOST)/lib/ocaml/findlib
	rm -r $(INSTALL_PATH)/usr/$(MINGW_HOST)/lib/ocaml/num-top
	# XXX topfind gets installed as %{_libdir}/ocaml - not sure why
	# but delete it anyway.
	rm -rf $(INSTALL_PATH)/usr/lib/ocaml
	# Override /etc/%{_mingw_target}-ocamlfind.conf with our
	# own version.
	rm $(INSTALL_PATH)/etc/$(MINGW_HOST)-ocamlfind.conf
	sed \
	  -e "s,@libdir@,/usr/$(MINGW_HOST)/lib,g" \
	  -e 's,@target@,$(MINGW_HOST),g' \
	  < debian/ocamlfind.conf.in \
	  > $(INSTALL_PATH)/etc/$(MINGW_HOST)-ocamlfind.conf
	# Install flexlink binary
	mkdir -p $(INSTALL_PATH)/usr/$(MINGW_HOST)/lib/ocaml/flexdll
	cd $(DEB_BUILDDIR)/$(FLEXDLL_DIR) && install -m 0755 flexlink.exe flexdll_mingw.o flexdll_initer_mingw.o \
	                                                     $(INSTALL_PATH)/usr/$(MINGW_HOST)/lib/ocaml/flexdll
	dh_link usr/$(MINGW_HOST)/lib/ocaml/flexdll/flexlink.exe usr/bin/flexlink
	# We choose which object we strip since this is not trivial here..
	strip --remove-section=.comment --remove-section=.note \
	  $(INSTALL_PATH)/usr/$(MINGW_HOST)/lib/ocaml/flexdll/flexlink.exe
	# Now we remove empty dirs..
	find $(INSTALL_PATH) -type d -empty -delete
	# Nothing in /usr/$(MINGW_HOST)/lib/ocaml should 'a priori' be executable except flexlink.exe..
	find $(INSTALL_PATH)/usr/$(MINGW_HOST)/lib/ocaml -type f -executable | grep -v flexlink.exe | while read i; do \
	    chmod -x $$i; done
	# Now make all script with #!/usr/bin/ocamlrun executables
	grep -r -l '#!/usr/$(MINGW_HOST)/bin/ocamlrun' $(INSTALL_PATH) | while read i; do \
	  sed -e 's|#!/usr/$(MINGW_HOST)/bin/ocamlrun|#!/usr/bin/$(MINGW_HOST)-ocamlrun|' -i $$i; \
	  chmod +x $$i; done
	# Remove rm -rf $(INSTALL_PATH)/usr/$(MINGW_HOST)/bin: all binaries should be prefixed and living in /usr/bin..
	rm -rf $(INSTALL_PATH)/usr/$(MINGW_HOST)/bin

clean::
	rm -f *.cdbs-config_list stamp-build-flexdll stamp-build-ocamlcore \
	      stamp-prepare-cross-build stamp-build-mingw-ocaml stamp-build-findlib \
	      stamp-patch-mingw-include