Backport from sid to buster
[hcoop/debian/mlton.git] / runtime / Makefile
CommitLineData
7f918cf1
CE
1## Copyright (C) 2010-2013,2018 Matthew Fluet.
2 # Copyright (C) 1999-2009 Henry Cejtin, Matthew Fluet, Suresh
3 # Jagannathan, and Stephen Weeks.
4 # Copyright (C) 1997-2000 NEC Research Institute.
5 #
6 # MLton is released under a BSD-style license.
7 # See the file MLton-LICENSE for details.
8 ##
9
10CC := gcc
11AR := ar
12RANLIB := ranlib
13
14WITH_GMP_DIR :=
15ifneq ($(WITH_GMP_DIR),)
16WITH_GMP_INC_DIR := $(WITH_GMP_DIR)/include
17WITH_GMP_LIB_DIR := $(WITH_GMP_DIR)/lib
18endif
19
20FIND := find
21GREP := grep
22GZIP := gzip
23PATCH := patch
24SED := sed
25TAR := tar
26
27######################################################################
28######################################################################
29
30SRC := $(shell cd .. && pwd)
31BUILD := $(SRC)/build
32BIN := $(BUILD)/bin
33
34PATH := $(BIN):$(shell echo $$PATH)
35
36HOST_ARCH := $(shell ../bin/host-arch)
37HOST_OS := $(shell ../bin/host-os)
38TARGET := self
39TARGET_ARCH := $(HOST_ARCH)
40TARGET_OS := $(HOST_OS)
41
42######################################################################
43
44ifeq ($(TARGET), self)
45CROSS_PREFIX :=
46else
47CROSS_PREFIX := $(TARGET)-
48endif
49
50GCC_MAJOR_VERSION := \
51 $(shell $(CC) -v 2>&1 | $(GREP) 'gcc version' | \
52 sed 's/.*gcc version \([0-9][0-9]*\)\.\([0-9][0-9]*\).*/\1/')
53GCC_MINOR_VERSION := \
54 $(shell $(CC) -v 2>&1 | $(GREP) 'gcc version' | \
55 sed 's/.*gcc version \([0-9][0-9]*\)\.\([0-9][0-9]*\).*/\2/')
56GCC_VERSION := $(GCC_MAJOR_VERSION).$(GCC_MINOR_VERSION)
57
58EXE :=
59
60# These flags can be overridden by the user
61CPPFLAGS :=
62CFLAGS :=
63
64WARNXCFLAGS :=
65WARNXCFLAGS += -pedantic -Wall
66ifeq ($(findstring $(GCC_MAJOR_VERSION), 4),$(GCC_MAJOR_VERSION))
67WARNXCFLAGS += -Wextra
68endif
69WARNXCFLAGS += -Wformat=2
70ifeq ($(findstring $(GCC_MAJOR_VERSION), 4),$(GCC_MAJOR_VERSION))
71WARNXCFLAGS += -Wswitch-default -Wswitch-enum
72endif
73WARNXCFLAGS += -Wuninitialized
74ifeq ($(findstring $(GCC_MAJOR_VERSION), 4),$(GCC_MAJOR_VERSION))
75WARNXCFLAGS += -Winit-self
76endif
77ifeq ($(findstring $(GCC_MAJOR_VERSION), 4),$(GCC_MAJOR_VERSION))
78WARNXCFLAGS += -Wstrict-aliasing=2
79endif
80WARNXCFLAGS += -Wfloat-equal
81WARNXCFLAGS += -Wundef
82WARNXCFLAGS += -Wshadow
83WARNXCFLAGS += -Wpointer-arith
84WARNXCFLAGS += -Wbad-function-cast -Wcast-qual
85WARNXCFLAGS += -Wwrite-strings
86# WARNXCFLAGS += -Wconversion
87WARNXCFLAGS += -Waggregate-return
88WARNXCFLAGS += -Wstrict-prototypes
89ifeq ($(findstring $(GCC_MAJOR_VERSION), 4),$(GCC_MAJOR_VERSION))
90WARNXCFLAGS += -Wold-style-definition
91endif
92WARNXCFLAGS += -Wmissing-prototypes -Wmissing-declarations
93ifeq ($(findstring $(GCC_MAJOR_VERSION), 4),$(GCC_MAJOR_VERSION))
94WARNXCFLAGS += -Wmissing-field-initializers
95endif
96WARNXCFLAGS += -Wmissing-noreturn
97WARNXCFLAGS += -Wmissing-format-attribute
98# WARNXCFLAGS += -Wpacked
99# WARNXCFLAGS += -Wpadded
100WARNXCFLAGS += -Wredundant-decls
101WARNXCFLAGS += -Wnested-externs
102# WARNXCFLAGS += -Wunreachable-code
103
104XCFLAGS := -std=gnu11 -fno-common $(WARNXCFLAGS)
105OPTXCFLAGS := -Wdisabled-optimization -O2 -fomit-frame-pointer
106DEBUGXCFLAGS := -DASSERT=1 -Wno-uninitialized -O0 -g
107PICXCFLAGS :=
108
109# Win32&64 don't use PIC code, all other platforms do
110ifeq ($(findstring $(TARGET_OS), mingw cygwin),)
111PICXCFLAGS += -fPIC
112endif
113
114# Make mlton library symbols private (win32&64 use another technique)
115ifeq ($(findstring $(GCC_MAJOR_VERSION), 4),$(GCC_MAJOR_VERSION))
116ifeq ($(findstring $(TARGET_OS), mingw cygwin),)
117XCFLAGS += -fvisibility=hidden
118endif
119endif
120
121ifeq ($(TARGET_ARCH), alpha)
122XCFLAGS += -mieee -mbwx -mtune=ev6 -mfp-rounding-mode=d
123endif
124
125ifeq ($(TARGET_ARCH), amd64)
126XCFLAGS += -m64
127endif
128
129ifeq ($(findstring $(TARGET_ARCH), hppa ia64 powerpc sparc),$(TARGET_ARCH))
130ifeq (4.2, $(firstword $(sort $(GCC_VERSION) 4.2)))
131# GMP headers contain C99 inline functions which generate warnings
132# with a suggestion to use this flag to disable the warnings.
133XCFLAGS += -fgnu89-inline
134endif
135endif
136
137ifeq ($(TARGET_ARCH), ia64)
138XCFLAGS += -mtune=itanium2
139ifeq ($(TARGET_OS), hpux)
140XCFLAGS += -mlp64
141endif
142endif
143
144ifeq ($(TARGET_OS)-$(TARGET_ARCH), aix-powerpc64)
145XCFLAGS += -maix64
146AR := ar -X 64 rc
147endif
148
149ifeq ($(TARGET_ARCH), sparc)
150XCFLAGS += -m32 -mcpu=v8 -Wa,-xarch=v8plusa
151endif
152
153ifeq ($(TARGET_ARCH), x86)
154XCFLAGS += -m32
155OPTXCFLAGS += -malign-loops=2 -malign-jumps=2 -malign-functions=5
156endif
157
158ifeq ($(TARGET_OS), cygwin)
159EXE := .exe
160endif
161
162ifeq ($(TARGET_OS), mingw)
163EXE := .exe
164# GCC doesn't recognize the %I64 format specifier which means %ll on windows
165XCFLAGS += -Wno-format -Wno-missing-format-attribute
166endif
167
168ifeq ($(TARGET_OS), solaris)
169XCFLAGS += -funroll-all-loops
170endif
171
172ifneq ($(WITH_GMP_INC_DIR),)
173XCFLAGS += -I$(WITH_GMP_INC_DIR)
174endif
175
176ifneq ($(WITH_GMP_LIB_DIR),)
177XCFLAGS += -L$(WITH_GMP_LIB_DIR)
178endif
179
180XCFLAGS += -I. -Iplatform
181OPTCFLAGS := $(CFLAGS) $(CPPFLAGS) $(XCFLAGS) $(OPTXCFLAGS)
182DEBUGCFLAGS := $(CFLAGS) $(CPPFLAGS) $(XCFLAGS) $(DEBUGXCFLAGS)
183PICCFLAGS := $(OPTCFLAGS) $(PICXCFLAGS)
184
185ALL := libgdtoa.a libgdtoa-gdb.a libgdtoa-pic.a \
186 libmlton.a libmlton-gdb.a libmlton-pic.a
187ALL += gen/c-types.sml gen/basis-ffi.sml gen/sizes
188
189all: $(ALL)
190
191
192### util ###
193
194UTILHFILES := \
195 util.h \
196 $(shell $(FIND) util -type f -name '*.h')
197UTILCFILES := \
198 $(shell $(FIND) util -type f -name '*.c')
199
200util-pic.o: util.c $(UTILCFILES) cenv.h $(UTILHFILES)
201 $(CROSS_PREFIX)$(CC) $(PICCFLAGS) -c -o $@ $<
202util-gdb.o: util.c $(UTILCFILES) cenv.h $(UTILHFILES)
203 $(CROSS_PREFIX)$(CC) $(DEBUGCFLAGS) -c -o $@ $<
204util.o: util.c $(UTILCFILES) cenv.h $(UTILHFILES)
205 $(CROSS_PREFIX)$(CC) $(OPTCFLAGS) -c -o $@ $<
206
207### c-types.h ml-types.h gen/c-types.sml ###
208
209c-types.h: gen/c-types.h
210 cp $< $@
211ml-types.h: gen/ml-types.h
212 cp $< $@
213gen/c-types.h gen/c-types.sml gen/ml-types.h: gen/gen-types.stamp
214 @touch $@
215gen/gen-types.stamp: gen/gen-types.c util.h util.o
216 $(CROSS_PREFIX)$(CC) $(OPTCFLAGS) -o gen/gen-types gen/gen-types.c util.o
217 rm -f gen/c-types.h gen/c-types.sml gen/ml-types.h gen/gen-types.stamp
218 cd gen && ./gen-types
219 rm -f gen/gen-types$(EXE) gen/gen-types
220 touch $@
221
222### basis-ffi.h gen/basis-ffi.sml ###
223
224basis-ffi.h: gen/basis-ffi.h
225 cp $< $@
226gen/basis-ffi.h gen/basis-ffi.sml: gen/gen-basis-ffi.stamp
227 @touch $@
228gen/gen-basis-ffi.stamp: gen/gen-basis-ffi.sml gen/basis-ffi.def
229 mlton -output gen/gen-basis-ffi gen/gen-basis-ffi.sml
230 rm -f gen/basis-ffi.h gen/basis-ffi.sml gen/gen-basis-ffi.stamp
231 cd gen && ./gen-basis-ffi
232 rm -f gen/gen-basis-ffi
233 touch $@
234
235### libgdtoa ###
236
237GDTOAHFILES := arith.h gdtoa.h
238GDTOAHFILES := $(patsubst %,gdtoa/%,$(GDTOAHFILES))
239GDTOACFILES := \
240 dmisc.c g_ddfmt.c g_ffmt_p.c gdtoa.c misc.c strtoIf.c strtodI.c strtopdd.c strtord.c sum.c \
241 dtoa.c g_ddfmt_p.c g_xLfmt.c gethex.c smisc.c strtoIg.c strtodg.c strtopf.c strtordd.c ulp.c \
242 g_Qfmt.c g_dfmt.c g_xLfmt_p.c gmisc.c strtoIQ.c strtoIx.c strtof.c strtopx.c strtorf.c \
243 g_Qfmt_p.c g_dfmt_p.c g_xfmt.c hd_init.c strtoId.c strtoIxL.c strtopQ.c strtopxL.c strtorx.c \
244 g__fmt.c g_ffmt.c g_xfmt_p.c hexnan.c strtoIdd.c strtod.c strtopd.c strtorQ.c strtorxL.c
245GDTOACFILES := $(patsubst %,gdtoa/%,$(GDTOACFILES))
246
247GDTOA_OBJS := $(patsubst %.c,%.o,$(GDTOACFILES))
248GDTOA_DEBUG_OBJS := $(patsubst %.c,%-gdb.o,$(GDTOACFILES))
249GDTOA_PIC_OBJS := $(patsubst %.c,%-pic.o,$(GDTOACFILES))
250
251gdtoa/README: gdtoa.tgz gdtoa.may_alias-unions.patch gdtoa.rename-public-fns.patch gdtoa.hide-private-fns.patch gdtoa.hide-public-fns.patch
252 $(GZIP) -dc gdtoa.tgz | $(TAR) xf -
253 $(PATCH) -s -d gdtoa -p1 <gdtoa.may_alias-unions.patch
254 $(PATCH) -s -d gdtoa -p1 <gdtoa.rename-public-fns.patch
255 $(PATCH) -s -d gdtoa -p1 <gdtoa.hide-private-fns.patch
256 $(PATCH) -s -d gdtoa -p1 <gdtoa.hide-public-fns.patch
257 @touch $@
258
259gdtoa/gdtoa.h $(GDTOACFILES): gdtoa/README
260 @touch $@
261
262gdtoa/arithchk.c: gdtoa/README
263 @touch $@
264
265gdtoa/arithchk.out: gdtoa/arithchk.c
266 cd gdtoa && $(CROSS_PREFIX)$(CC) $(OPTCFLAGS) -w -O1 -o arithchk.out arithchk.c
267
268gdtoa/arith.h: gdtoa/arithchk.out
269 cd gdtoa && ./arithchk.out >arith.h
270
271gdtoa/qnan.c: gdtoa/README
272 @touch $@
273
274gdtoa/qnan.out: gdtoa/arith.h gdtoa/qnan.c
275 cd gdtoa && $(CROSS_PREFIX)$(CC) $(OPTCFLAGS) -w -O1 -o qnan.out qnan.c
276
277gdtoa/gd_qnan.h: gdtoa/qnan.out
278 cd gdtoa && ./qnan.out >gd_qnan.h
279
280gdtoa/%-pic.o: gdtoa/%.c gdtoa/arith.h gdtoa/gd_qnan.h
281 $(CROSS_PREFIX)$(CC) $(PICCFLAGS) -w -DINFNAN_CHECK -c -o $@ $<
282gdtoa/%-gdb.o: gdtoa/%.c gdtoa/arith.h gdtoa/gd_qnan.h
283 $(CROSS_PREFIX)$(CC) $(DEBUGCFLAGS) -w -DINFNAN_CHECK -c -o $@ $<
284gdtoa/%.o: gdtoa/%.c gdtoa/arith.h gdtoa/gd_qnan.h
285 $(CROSS_PREFIX)$(CC) $(OPTCFLAGS) -w -DINFNAN_CHECK -c -o $@ $<
286
287libgdtoa.a: $(GDTOA_OBJS)
288libgdtoa-gdb.a: $(GDTOA_DEBUG_OBJS)
289libgdtoa-pic.a: $(GDTOA_PIC_OBJS)
290
291### libmlton ###
292
293PLATFORMHFILES := \
294 platform.h \
295 $(shell $(FIND) platform -type f -name '*.h')
296PLATFORMCFILES := \
297 $(shell $(FIND) platform -type f -name '*.c')
298
299GCHFILES := \
300 gc.h \
301 $(shell $(FIND) gc -type f -name '*.h')
302GCCFILES := \
303 $(shell $(FIND) gc -type f -name '*.c')
304
305BASISCFILES := \
306 $(shell $(FIND) basis -type f -name '*.c')
307
308HFILES := \
309 cenv.h \
310 $(UTILHFILES) \
311 ml-types.h \
312 c-types.h \
313 basis-ffi.h \
314 $(PLATFORMHFILES) \
315 $(GCHFILES)
316
317MLTON_OBJS := \
318 util.o \
319 platform.o \
320 platform/$(TARGET_OS).o \
321 gc.o
322MLTON_OBJS += $(foreach f, $(basename $(BASISCFILES)), $(f).o)
323MLTON_DEBUG_OBJS := $(patsubst %.o,%-gdb.o,$(MLTON_OBJS))
324MLTON_PIC_OBJS := $(patsubst %.o,%-pic.o,$(MLTON_OBJS))
325
326platform/$(TARGET_OS)-pic.o: $(PLATFORMCFILES)
327platform/$(TARGET_OS)-gdb.o: $(PLATFORMCFILES)
328platform/$(TARGET_OS).o: $(PLATFORMCFILES)
329
330gc-pic.o: $(GCCFILES)
331gc-gdb.o: $(GCCFILES)
332gc.o: $(GCCFILES)
333
334gc.c_XCFLAGS := -Wno-unreachable-code
335
336basis/Real/Math-pic.o: basis/Real/Math-fns.h
337basis/Real/Math-gdb.o: basis/Real/Math-fns.h
338basis/Real/Math.o: basis/Real/Math-fns.h
339basis/Real/Real-pic.o: basis/Real/Real-ops.h
340basis/Real/Real-gdb.o: basis/Real/Real-ops.h
341basis/Real/Real.o: basis/Real/Real-ops.h
342basis/Real/Real.c_XCFLAGS := -Wno-float-equal
343basis/Real/gdtoa-pic.o: $(GDTOAHFILES)
344basis/Real/gdtoa-gdb.o: $(GDTOAHFILES)
345basis/Real/gdtoa.o: $(GDTOAHFILES)
346basis/Real/strto-pic.o: $(GDTOAHFILES)
347basis/Real/strto-gdb.o: $(GDTOAHFILES)
348basis/Real/strto.o: $(GDTOAHFILES)
349basis/System/Date.c_XCFLAGS := -Wno-format-nonliteral
350basis/Word/Word-pic.o: basis/Word/Word-consts.h basis/Word/Word-ops.h basis/Word/Word-check.h
351basis/Word/Word-gdb.o: basis/Word/Word-consts.h basis/Word/Word-ops.h basis/Word/Word-check.h
352basis/Word/Word.o: basis/Word/Word-consts.h basis/Word/Word-ops.h basis/Word/Word-check.h
353basis/coerce-pic.o: basis/coerce.h
354basis/coerce-gdb.o: basis/coerce.h
355basis/coerce.o: basis/coerce.h
356basis/cpointer-pic.o: basis/cpointer.h
357basis/cpointer-gdb.o: basis/cpointer.h
358basis/cpointer.o: basis/cpointer.h
359
360%-pic.o: %.c $(HFILES)
361 $(CROSS_PREFIX)$(CC) $(PICCFLAGS) $($(<)_XCFLAGS) -c -o $@ $<
362%-gdb.o: %.c $(HFILES)
363 $(CROSS_PREFIX)$(CC) $(DEBUGCFLAGS) $($(<)_XCFLAGS) -c -o $@ $<
364%.o: %.c $(HFILES)
365 $(CROSS_PREFIX)$(CC) $(OPTCFLAGS) $($(<)_XCFLAGS) -c -o $@ $<
366
367libmlton.a: $(MLTON_OBJS)
368libmlton-gdb.a: $(MLTON_DEBUG_OBJS)
369libmlton-pic.a: $(MLTON_PIC_OBJS)
370
371### gen/sizes ###
372
373gen/sizes: gen/gen-sizes.stamp
374 @touch $@
375gen/gen-sizes.stamp: gen/gen-sizes.c libmlton.a $(HFILES)
376 $(CROSS_PREFIX)$(CC) $(OPTCFLAGS) -o gen/gen-sizes gen/gen-sizes.c -L. -lmlton
377 rm -f gen/sizes
378 cd gen && ./gen-sizes
379 rm -f gen/gen-sizes$(EXE) gen/gen-sizes
380 touch $@
381
382
383######
384
385
386%.a:
387 rm -f $@
388 $(CROSS_PREFIX)$(AR) rc $@ $^
389 $(CROSS_PREFIX)$(RANLIB) $@
390
391
392
393.PHONY: flags
394flags:
395 @echo TARGET = $(TARGET)
396 @echo TARGET_ARCH = $(TARGET_ARCH)
397 @echo TARGET_OS = $(TARGET_OS)
398 @echo GCC_MAJOR_VERSION = $(GCC_MAJOR_VERSION)
399 @echo GCC_MINOR_VERSION = $(GCC_MINOR_VERSION)
400 @echo GCC_VERSION = $(GCC_VERSION)
401 @echo EXE = $(EXE)
402 @echo XCFLAGS = $(XCFLAGS)
403 @echo OPTXCFLAGS = $(OPTXCFLAGS)
404 @echo DEBUGXCFLAGS = $(DEBUGXCFLAGS)
405 @echo PICXCFLAGS = $(PICXCFLAGS)
406
407
408.PHONY: clean
409clean:
410 ../bin/clean