1#
2# %CopyrightBegin%
3#
4# Copyright Ericsson AB 2004-2020. All Rights Reserved.
5#
6# Licensed under the Apache License, Version 2.0 (the "License");
7# you may not use this file except in compliance with the License.
8# You may obtain a copy of the License at
9#
10#     http://www.apache.org/licenses/LICENSE-2.0
11#
12# Unless required by applicable law or agreed to in writing, software
13# distributed under the License is distributed on an "AS IS" BASIS,
14# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15# See the License for the specific language governing permissions and
16# limitations under the License.
17#
18# %CopyrightEnd%
19#
20
21include $(ERL_TOP)/make/output.mk
22include $(ERL_TOP)/make/target.mk
23include ../include/internal/$(TARGET)/ethread.mk
24
25ifeq ($(TARGET),win32)
26EXE_SUFFIX=.exe
27else
28EXE_SUFFIX=
29endif
30
31OMIT_OMIT_FP=no
32
33CC=@CC@
34LD=@LD@
35AR=@AR@
36RANLIB=@RANLIB@
37MKDIR=@MKDIR@
38INSTALL=@INSTALL@
39INSTALL_DIR=@INSTALL_DIR@
40INSTALL_DATA=@INSTALL_DATA@
41INSTALL_PROGRAM=@INSTALL_PROGRAM@
42
43ERLANG_OSTYPE=@ERLANG_OSTYPE@
44
45OMIT_FP=false
46CFLAGS=$(subst O2,O3, @CFLAGS@)
47LDFLAGS=@LDFLAGS@
48
49ifeq ($(TYPE),debug)
50CFLAGS=@DEBUG_CFLAGS@ -DDEBUG
51TYPE_SUFFIX=.debug
52ifeq ($(USING_VC),yes)
53LD_FLAGS += -g
54endif
55PRE_LD=
56
57else
58
59ifeq ($(TYPE),gcov)
60CFLAGS=@DEBUG_CFLAGS@ -DGCOV -fprofile-arcs -ftest-coverage -O0
61TYPE_SUFFIX=.gcov
62PRE_LD=
63else
64ifeq ($(TYPE),valgrind)
65CFLAGS=@DEBUG_CFLAGS@ -DVALGRIND
66TYPE_SUFFIX=.valgrind
67PRE_LD=
68else
69ifeq ($(TYPE),asan)
70CFLAGS=@DEBUG_CFLAGS@
71TYPE_SUFFIX=.asan
72PRE_LD=
73else
74ifeq ($(TYPE),gprof)
75CFLAGS += -DGPROF -pg
76TYPE_SUFFIX=.gprof
77PRE_LD=
78else
79ifeq ($(TYPE),lcnt)
80TYPE_SUFFIX = .lcnt
81CFLAGS += -DERTS_ENABLE_LOCK_COUNT
82OMIT_FP=true
83PRE_LD=
84else
85ifeq ($(TYPE),frmptr)
86TYPE_SUFFIX = .frmptr
87CFLAGS += -DERTS_FRMPTR
88OMIT_OMIT_FP=yes
89PRE_LD=
90else
91ifeq ($(TYPE),icount)
92TYPE_SUFFIX = .icount
93CFLAGS += -DERTS_OPCODE_COUNTER_SUPPORT
94PRE_LD=
95else
96override TYPE=opt
97OMIT_FP=true
98TYPE_SUFFIX=
99PRE_LD=
100endif
101endif
102endif
103endif
104endif
105endif
106endif
107endif
108
109OPSYS=@OPSYS@
110sol2CFLAGS=
111linuxCFLAGS=
112darwinCFLAGS=-DDARWIN
113noopsysCFLAGS=
114OPSYSCFLAGS=$($(OPSYS)CFLAGS)
115ARCH=@ARCH@
116ultrasparcCFLAGS=-Wa,-xarch=v8plusa
117ARCHCFLAGS=$($(ARCH)CFLAGS)
118
119ifeq ($(OMIT_OMIT_FP),yes)
120CFLAGS += -fno-omit-frame-pointer
121OMIT_FP=false
122endif
123
124CREATE_DIRS=
125
126ifeq ($(CC)-$(OMIT_FP), gcc-true)
127CFLAGS += -fomit-frame-pointer
128endif
129
130CFLAGS += @WFLAGS@ @DEFS@ $(ARCHCFLAGS)
131
132ifeq ($(findstring -D_GNU_SOURCE,$(CFLAGS)),)
133THR_DEFS = $(ETHR_DEFS)
134else
135# Remove duplicate -D_GNU_SOURCE
136THR_DEFS = $(filter-out -D_GNU_SOURCE%, $(ETHR_DEFS))
137endif
138
139LIBS=@LIBS@
140
141TT_DIR=$(TARGET)/$(TYPE)
142
143ERTS_INCL=../include
144ERTS_INCL_INT=../include/internal
145
146INCLUDES=-I$(ERTS_INCL) -I$(ERTS_INCL)/$(TARGET) -I$(ERTS_INCL_INT) -I$(ERTS_INCL_INT)/$(TARGET)
147INCLUDES += -I../emulator/beam -I../emulator/sys/$(ERLANG_OSTYPE)
148
149USING_VC=@MIXED_VC@
150
151ifeq ($(USING_VC),yes)
152LIB_SUFFIX=.lib
153LIB_PREFIX=
154else
155LIB_SUFFIX=.a
156LIB_PREFIX=lib
157endif
158
159OBJS_ROOT_DIR=obj
160OBJ_DIR=$(OBJS_ROOT_DIR)/$(TT_DIR)
161
162CREATE_DIRS += $(OBJ_DIR)
163
164ERTS_LIBS=
165
166ifeq ($(findstring -D_GNU_SOURCE,$(CFLAGS)),)
167THR_DEFS = $(ETHR_DEFS)
168else
169# Remove duplicate -D_GNU_SOURCE
170THR_DEFS = $(filter-out -D_GNU_SOURCE%, $(ETHR_DEFS))
171endif
172
173#
174# erts (public) library
175#
176
177ERTS_LIB_SRCS =	common/erl_memory_trace_parser.c
178
179ERTS_LIB_DIR=../lib/$(TARGET)
180CREATE_DIRS += $(ERTS_LIB_DIR)
181
182ifeq ($(USING_VC),yes)
183# Windows obj dir
184MD_OBJ_DIR=$(OBJ_DIR)/MD
185MDd_OBJ_DIR=$(OBJ_DIR)/MDd
186MT_OBJ_DIR=$(OBJ_DIR)/MT
187MTd_OBJ_DIR=$(OBJ_DIR)/MTd
188
189CREATE_DIRS +=	$(MD_OBJ_DIR) \
190		$(MDd_OBJ_DIR) \
191		$(MT_OBJ_DIR) \
192		$(MTd_OBJ_DIR)
193
194ERTS_MD_LIB_OBJS=$(addprefix $(MD_OBJ_DIR)/,$(notdir $(ERTS_LIB_SRCS:.c=.o)))
195ERTS_MDd_LIB_OBJS=$(addprefix $(MDd_OBJ_DIR)/,$(notdir $(ERTS_LIB_SRCS:.c=.o)))
196ERTS_MT_LIB_OBJS=$(addprefix $(MT_OBJ_DIR)/,$(notdir $(ERTS_LIB_SRCS:.c=.o)))
197ERTS_MTd_LIB_OBJS=$(addprefix $(MTd_OBJ_DIR)/,$(notdir $(ERTS_LIB_SRCS:.c=.o)))
198
199else # --- Not windows ---
200
201# Reentrant obj dir
202ifneq ($(strip $(ETHR_LIB_NAME)),)
203r_OBJ_DIR = $(OBJ_DIR)/r
204CREATE_DIRS += $(r_OBJ_DIR)
205ERTS_r_LIB_OBJS=$(addprefix $(r_OBJ_DIR)/,$(notdir $(ERTS_LIB_SRCS:.c=.o)))
206endif
207ERTS_LIB_OBJS=$(addprefix $(OBJ_DIR)/,$(notdir $(ERTS_LIB_SRCS:.c=.o)))
208
209endif
210
211ifeq ($(USING_VC),yes)
212ERTS_MD_LIB=$(ERTS_LIB_DIR)/$(LIB_PREFIX)erts_MD$(TYPE_SUFFIX)$(LIB_SUFFIX)
213ERTS_MDd_LIB=$(ERTS_LIB_DIR)/$(LIB_PREFIX)erts_MDd$(TYPE_SUFFIX)$(LIB_SUFFIX)
214ERTS_MT_LIB=$(ERTS_LIB_DIR)/$(LIB_PREFIX)erts_MT$(TYPE_SUFFIX)$(LIB_SUFFIX)
215ERTS_MTd_LIB=$(ERTS_LIB_DIR)/$(LIB_PREFIX)erts_MTd$(TYPE_SUFFIX)$(LIB_SUFFIX)
216ERTS_LIBS += \
217	$(ERTS_MD_LIB) \
218	$(ERTS_MDd_LIB) \
219	$(ERTS_MT_LIB) \
220	$(ERTS_MTd_LIB)
221else
222
223ERTS_LIB = $(ERTS_LIB_DIR)/$(LIB_PREFIX)erts$(TYPE_SUFFIX)$(LIB_SUFFIX)
224ERTS_LIBS += $(ERTS_LIB)
225
226ifneq ($(strip $(ETHR_LIB_NAME)),)
227ERTS_r_LIB = $(ERTS_LIB_DIR)/$(LIB_PREFIX)erts_r$(TYPE_SUFFIX)$(LIB_SUFFIX)
228ERTS_LIBS += $(ERTS_r_LIB)
229endif
230
231endif
232
233#
234# erts_internal library
235#
236
237ERTS_LIB_INTERNAL_DIR=../lib/internal/$(TARGET)
238CREATE_DIRS += $(ERTS_LIB_INTERNAL_DIR)
239
240ERTS_INTERNAL_LIBS=
241
242ERTS_INTERNAL_LIB_SRCS = \
243	common/erl_printf_format.c \
244	common/erl_printf.c \
245	common/erl_misc_utils.c
246
247ERTS_INTERNAL_LIB_NAME=erts_internal$(TYPE_SUFFIX)
248
249ifeq ($(USING_VC),yes)
250ifeq ($(TYPE),debug)
251ERTS_INTERNAL_LIB_OBJS = \
252	$(addprefix $(MTd_OBJ_DIR)/,$(notdir $(ERTS_INTERNAL_LIB_SRCS:.c=.o)))
253else
254ERTS_INTERNAL_LIB_OBJS = \
255	$(addprefix $(MT_OBJ_DIR)/,$(notdir $(ERTS_INTERNAL_LIB_SRCS:.c=.o)))
256endif
257else
258ERTS_INTERNAL_LIB_OBJS = \
259	$(addprefix $(OBJ_DIR)/,$(notdir $(ERTS_INTERNAL_LIB_SRCS:.c=.o)))
260endif
261
262ERTS_INTERNAL_LIB=$(ERTS_LIB_INTERNAL_DIR)/$(LIB_PREFIX)$(ERTS_INTERNAL_LIB_NAME)$(LIB_SUFFIX)
263
264ERTS_INTERNAL_LIBS += $(ERTS_INTERNAL_LIB)
265
266ifneq ($(strip $(ETHR_LIB_NAME)),)
267ERTS_INTERNAL_r_LIB_NAME=erts_internal_r$(TYPE_SUFFIX)
268
269ifeq ($(USING_VC),yes)
270ifeq ($(TYPE),debug)
271ERTS_INTERNAL_r_LIB_OBJS = \
272	$(addprefix $(MDd_OBJ_DIR)/,$(notdir $(ERTS_INTERNAL_LIB_SRCS:.c=.o)))
273else
274ERTS_INTERNAL_r_LIB_OBJS = \
275	$(addprefix $(MD_OBJ_DIR)/,$(notdir $(ERTS_INTERNAL_LIB_SRCS:.c=.o)))
276endif
277else
278ERTS_INTERNAL_r_LIB_OBJS = \
279	$(addprefix $(r_OBJ_DIR)/,$(notdir $(ERTS_INTERNAL_LIB_SRCS:.c=.o)))
280endif
281
282ERTS_INTERNAL_r_LIB=$(ERTS_LIB_INTERNAL_DIR)/$(LIB_PREFIX)$(ERTS_INTERNAL_r_LIB_NAME)$(LIB_SUFFIX)
283
284ERTS_INTERNAL_LIBS += $(ERTS_INTERNAL_r_LIB)
285
286endif
287
288#
289# ethread library
290#
291ETHR_THR_LIB_BASE_DIR=@ETHR_THR_LIB_BASE_DIR@
292ifneq ($(strip $(ETHR_LIB_NAME)),)
293ETHREAD_LIB_SRC=common/ethr_aux.c \
294		common/ethr_atomics.c \
295		common/ethr_mutex.c \
296		common/ethr_cbf.c \
297		$(ETHR_THR_LIB_BASE_DIR)/ethread.c \
298		$(ETHR_THR_LIB_BASE_DIR)/ethr_event.c
299ETHR_X86_SSE2_ASM=@ETHR_X86_SSE2_ASM@
300ifeq ($(ETHR_X86_SSE2_ASM),yes)
301ETHREAD_LIB_SRC += pthread/ethr_x86_sse2_asm.c
302endif
303ETHREAD_LIB_NAME=ethread$(TYPE_SUFFIX)
304
305ifeq ($(USING_VC),yes)
306ifeq ($(TYPE),debug)
307ETHREAD_LIB_OBJS = \
308	$(addprefix $(MDd_OBJ_DIR)/,$(notdir $(ETHREAD_LIB_SRC:.c=.o)))
309else
310ETHREAD_LIB_OBJS = \
311	$(addprefix $(MD_OBJ_DIR)/,$(notdir $(ETHREAD_LIB_SRC:.c=.o)))
312endif
313else
314ETHREAD_LIB_OBJS = \
315	$(addprefix $(r_OBJ_DIR)/,$(notdir $(ETHREAD_LIB_SRC:.c=.o)))
316endif
317
318ETHREAD_LIB=$(ERTS_LIB_INTERNAL_DIR)/$(LIB_PREFIX)$(ETHREAD_LIB_NAME)$(LIB_SUFFIX)
319
320else
321
322ETHREAD_LIB_SRC=
323ETHREAD_LIB_NAME=
324ETHREAD_LIB_OBJS=
325ETHREAD_LIB=
326
327endif
328
329ifneq ($(strip $(CREATE_DIRS)),)
330_create_dirs := $(shell mkdir -p $(CREATE_DIRS))
331endif
332
333#
334# Everything to build
335#
336.PHONY: all
337all: $(OBJ_DIR)/MADE
338
339YCF_SOURCE_DIR=$(ERL_TOP)/erts/lib_src/yielding_c_fun
340
341include $(YCF_SOURCE_DIR)/main_target.mk
342
343$(OBJ_DIR)/MADE: $(YCF_EXECUTABLE) $(ETHREAD_LIB) $(ERTS_LIBS) $(ERTS_INTERNAL_LIBS)
344	$(gen_verbose)
345ifeq ($(OMIT_OMIT_FP),yes)
346	@echo '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *'
347	@echo '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *'
348	@echo '* *                                                         * *'
349	@echo '* * NOTE: Omit frame pointer optimization has been omitted  * *'
350	@echo '* *                                                         * *'
351	@echo '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *'
352	@echo '* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *'
353endif
354	$(V_at)echo $? > $(OBJ_DIR)/MADE
355
356#
357# The libs ...
358#
359ifeq ($(USING_VC),yes)
360AR_OUT=-out:
361AR_FLAGS=
362else
363AR_OUT=
364ifeq ($(V),0)
365AR_FLAGS=rc
366else
367AR_FLAGS=rcv
368endif
369endif
370
371ifndef RANLIB
372RANLIB=true
373endif
374
375$(ETHREAD_LIB): $(ETHREAD_LIB_OBJS)
376	$(V_AR) $(AR_FLAGS) $(AR_OUT)$@ $(ETHREAD_LIB_OBJS)
377	$(V_RANLIB) $@
378
379$(ERTS_INTERNAL_LIB): $(ERTS_INTERNAL_LIB_OBJS)
380	$(V_AR) $(AR_FLAGS) $(AR_OUT)$@ $(ERTS_INTERNAL_LIB_OBJS)
381	$(V_RANLIB) $@
382
383$(ERTS_INTERNAL_r_LIB): $(ERTS_INTERNAL_r_LIB_OBJS)
384	$(V_AR) $(AR_FLAGS) $(AR_OUT)$@ $(ERTS_INTERNAL_r_LIB_OBJS)
385	$(V_RANLIB) $@
386
387$(ERTS_MD_LIB): $(ERTS_MD_LIB_OBJS)
388	$(V_AR) $(AR_FLAGS) $(AR_OUT)$@ $(ERTS_MD_LIB_OBJS)
389	$(V_RANLIB) $@
390
391$(ERTS_MDd_LIB): $(ERTS_MDd_LIB_OBJS)
392	$(V_AR) $(AR_FLAGS) $(AR_OUT)$@ $(ERTS_MDd_LIB_OBJS)
393	$(V_RANLIB) $@
394
395$(ERTS_MT_LIB): $(ERTS_MT_LIB_OBJS)
396	$(V_AR) $(AR_FLAGS) $(AR_OUT)$@ $(ERTS_MT_LIB_OBJS)
397	$(V_RANLIB) $@
398
399$(ERTS_MTd_LIB): $(ERTS_MTd_LIB_OBJS)
400	$(V_AR) $(AR_FLAGS) $(AR_OUT)$@ $(ERTS_MTd_LIB_OBJS)
401	$(V_RANLIB) $@
402
403$(ERTS_r_LIB): $(ERTS_r_LIB_OBJS)
404	$(V_AR) $(AR_FLAGS) $(AR_OUT)$@ $(ERTS_r_LIB_OBJS)
405	$(V_RANLIB) $@
406
407$(ERTS_LIB): $(ERTS_LIB_OBJS)
408	$(V_AR) $(AR_FLAGS) $(AR_OUT)$@ $(ERTS_LIB_OBJS)
409	$(V_RANLIB) $@
410
411#
412# Object files
413#
414
415$(r_OBJ_DIR)/ethr_x86_sse2_asm.o: pthread/ethr_x86_sse2_asm.c
416	$(V_CC) -msse2 $(THR_DEFS) $(CFLAGS) $(INCLUDES) -c $< -o $@
417
418$(r_OBJ_DIR)/%.o: common/%.c
419	$(V_CC) $(THR_DEFS) $(CFLAGS) $(INCLUDES) -c $< -o $@
420
421$(r_OBJ_DIR)/%.o: $(ETHR_THR_LIB_BASE_DIR)/%.c
422	$(V_CC) $(THR_DEFS) $(CFLAGS) $(INCLUDES) -c $< -o $@
423
424$(OBJ_DIR)/%.o: common/%.c
425	$(V_CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
426
427$(OBJ_DIR)/%.o: $(ETHR_THR_LIB_BASE_DIR)/%.c
428	$(V_CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
429
430# Win32 specific
431
432$(MD_OBJ_DIR)/%.o: common/%.c
433	$(V_CC) $(THR_DEFS) $(CFLAGS) -MD $(INCLUDES) -c $< -o $@
434
435$(MD_OBJ_DIR)/%.o: $(ETHR_THR_LIB_BASE_DIR)/%.c
436	$(V_CC) $(THR_DEFS) $(CFLAGS) -MD $(INCLUDES) -c $< -o $@
437
438$(MDd_OBJ_DIR)/%.o: common/%.c
439	$(V_CC) $(THR_DEFS) $(CFLAGS) -MDd $(INCLUDES) -c $< -o $@
440
441$(MDd_OBJ_DIR)/%.o: $(ETHR_THR_LIB_BASE_DIR)/%.c
442	$(V_CC) $(THR_DEFS) $(CFLAGS) -MDd $(INCLUDES) -c $< -o $@
443
444$(MT_OBJ_DIR)/%.o: common/%.c
445	$(V_CC) $(THR_DEFS) $(CFLAGS) -MT $(INCLUDES) -c $< -o $@
446
447$(MT_OBJ_DIR)/%.o: $(ETHR_THR_LIB_BASE_DIR)/%.c
448	$(V_CC) $(THR_DEFS) $(CFLAGS) -MT $(INCLUDES) -c $< -o $@
449
450$(MTd_OBJ_DIR)/%.o: common/%.c
451	$(V_CC) $(THR_DEFS) $(CFLAGS) -MTd $(INCLUDES) -c $< -o $@
452
453$(MTd_OBJ_DIR)/%.o: $(ETHR_THR_LIB_BASE_DIR)/%.c
454	$(V_CC) $(THR_DEFS) $(CFLAGS) -MTd $(INCLUDES) -c $< -o $@
455
456#
457# Install
458#
459
460include $(ERL_TOP)/make/otp_release_targets.mk
461include ../vsn.mk
462RELSYSDIR = $(RELEASE_PATH)/erts-$(VSN)
463
464RELEASE_INCLUDES= \
465	$(ERTS_INCL)/erl_memory_trace_parser.h \
466	$(ERTS_INCL)/$(TARGET)/erl_int_sizes_config.h \
467	$(ERTS_INCL)/erl_fixed_size_int_types.h
468RELEASE_LIBS=$(ERTS_LIBS)
469
470INTERNAL_RELEASE_INCLUDES= \
471	$(ERTS_INCL_INT)/README \
472	$(ERTS_INCL_INT)/ethread.h \
473	$(ERTS_INCL_INT)/ethread_inline.h \
474	$(ERTS_INCL_INT)/ethr_mutex.h \
475	$(ERTS_INCL_INT)/ethr_optimized_fallbacks.h \
476	$(ERTS_INCL_INT)/ethr_atomics.h \
477	$(ERTS_INCL_INT)/$(TARGET)/ethread.mk \
478	$(ERTS_INCL_INT)/$(TARGET)/erts_internal.mk \
479	$(ERTS_INCL_INT)/$(TARGET)/ethread_header_config.h \
480	$(ERTS_INCL_INT)/erl_printf.h \
481	$(ERTS_INCL_INT)/erl_printf_format.h \
482	$(ERTS_INCL_INT)/erl_memory_trace_protocol.h \
483	$(ERTS_INCL_INT)/erl_misc_utils.h \
484	$(ERTS_INCL_INT)/erl_errno.h
485
486INTERNAL_X_RELEASE_INCLUDE_DIRS= \
487        i386 x86_64 ppc32 sparc32 sparc64 tile gcc pthread win libatomic_ops
488
489INTERNAL_RELEASE_LIBS= \
490	../lib/internal/README \
491	$(ETHREAD_LIB) \
492	$(ERTS_INTERNAL_LIBS)
493
494.PHONY: release_spec
495release_spec: all
496	$(INSTALL_PROGRAM) $(YCF_EXECUTABLE) "$(RELSYSDIR)/bin"
497ifneq ($(strip $(RELEASE_INCLUDES)),)
498	$(INSTALL_DIR) "$(RELSYSDIR)/include"
499	$(INSTALL_DIR) "$(RELEASE_PATH)/usr/include"
500	$(INSTALL_DATA) $(RELEASE_INCLUDES) "$(RELSYSDIR)/include"
501	$(INSTALL_DATA) $(RELEASE_INCLUDES) "$(RELEASE_PATH)/usr/include"
502endif
503ifneq ($(strip $(INTERNAL_RELEASE_INCLUDES)),)
504	$(INSTALL_DIR) "$(RELSYSDIR)/include/internal"
505	$(INSTALL_DATA) $(INTERNAL_RELEASE_INCLUDES) "$(RELSYSDIR)/include/internal"
506endif
507ifneq ($(strip $(INTERNAL_X_RELEASE_INCLUDE_DIRS)),)
508	for xdir in $(INTERNAL_X_RELEASE_INCLUDE_DIRS); do \
509		$(INSTALL_DIR) "$(RELSYSDIR)/include/internal/$$xdir"; \
510		$(INSTALL_DATA) $(ERTS_INCL_INT)/$$xdir/*.h \
511			"$(RELSYSDIR)/include/internal/$$xdir"; \
512	done
513endif
514ifneq ($(strip $(RELEASE_LIBS)),)
515	$(INSTALL_DIR) "$(RELSYSDIR)/lib"
516	$(INSTALL_DIR) "$(RELEASE_PATH)/usr/lib"
517	$(INSTALL_DATA) $(RELEASE_LIBS) "$(RELSYSDIR)/lib"
518	$(INSTALL_DATA) $(RELEASE_LIBS) "$(RELEASE_PATH)/usr/lib"
519endif
520ifneq ($(strip $(INTERNAL_RELEASE_LIBS)),)
521	$(INSTALL_DIR) "$(RELSYSDIR)/lib/internal"
522	$(INSTALL_DATA) $(INTERNAL_RELEASE_LIBS) "$(RELSYSDIR)/lib/internal"
523endif
524
525.PHONY: docs
526docs:
527
528.PHONY: release_docs_spec
529release_docs_spec:
530
531#
532# Cleanup
533#
534.PHONY: clean
535clean:
536	$(RM) -r ../lib/internal/$(TARGET)/*
537	$(RM) -r ../lib/$(TARGET)/*
538	$(RM) -r obj/$(TARGET)/*
539	$(RM) yielding_c_fun/bin/$(TARGET)/*
540	$(RM) yielding_c_fun/$(TARGET)/*
541
542#
543# Make dependencies
544#
545
546ifeq ($(USING_VC),yes)
547# VC++ used for compiling. We undef __GNUC__ since if __GNUC__ is defined
548# we will include other headers than when compiling which will result in
549# faulty dependencies.
550#DEP_CC=@EMU_CC@ -U__GNUC__
551DEP_CC=$(CC)
552else
553DEP_CC=$(CC)
554endif
555
556#SED_REPL_WIN_DRIVE=s|\([ 	]\)\([A-Za-z]\):|\1/cygdrive/\2|g;s|^\([A-Za-z]\):|/cygdrive/\1|g
557SED_REPL_O=s|^\([^:]*\)\.o:|$$(OBJ_DIR)/\1.o:|g
558SED_REPL_r_O=s|^\([^:]*\)\.o:|$$(r_OBJ_DIR)/\1.o:|g
559SED_REPL_MD_O=s|^\([^:]*\)\.o:|$$(MD_OBJ_DIR)/\1.o:|g
560SED_REPL_MDd_O=s|^\([^:]*\)\.o:|$$(MDd_OBJ_DIR)/\1.o:|g
561SED_REPL_MT_O=s|^\([^:]*\)\.o:|$$(MT_OBJ_DIR)/\1.o:|g
562SED_REPL_MTd_O=s|^\([^:]*\)\.o:|$$(MTd_OBJ_DIR)/\1.o:|g
563SED_REPL_TT_DIR=s|$(TT_DIR)/|$$(TT_DIR)/|g
564SED_REPL_TARGET=s|$(TARGET)/|$$(TARGET)/|g
565
566ifeq ($(TARGET),win32)
567#SED_PREFIX=$(SED_REPL_WIN_DRIVE);
568SED_PREFIX=
569DEP_FLAGS=$(subst -O3,,$(subst -O2,,$(CFLAGS))) $(INCLUDES)
570else
571SED_PREFIX=
572DEP_FLAGS=$(CFLAGS) $(INCLUDES)
573endif
574
575SED_DEPEND=sed '$(SED_PREFIX)$(SED_REPL_O);$(SED_REPL_TT_DIR);$(SED_REPL_TARGET)'
576SED_r_DEPEND=sed '$(SED_PREFIX)$(SED_REPL_r_O);$(SED_REPL_TT_DIR);$(SED_REPL_TARGET)'
577SED_MD_DEPEND=sed '$(SED_PREFIX)$(SED_REPL_MD_O);$(SED_REPL_TT_DIR);$(SED_REPL_TARGET)'
578SED_MDd_DEPEND=sed '$(SED_PREFIX)$(SED_REPL_MDd_O);$(SED_REPL_TT_DIR);$(SED_REPL_TARGET)'
579SED_MT_DEPEND=sed '$(SED_PREFIX)$(SED_REPL_MT_O);$(SED_REPL_TT_DIR);$(SED_REPL_TARGET)'
580SED_MTd_DEPEND=sed '$(SED_PREFIX)$(SED_REPL_MTd_O);$(SED_REPL_TT_DIR);$(SED_REPL_TARGET)'
581
582DEPEND_MK=$(OBJ_DIR)/depend.mk
583
584.PHONY: depend
585depend: $(DEPEND_MK)
586$(DEPEND_MK):
587	$(gen_verbose)
588	$(V_colon)@echo "Generating dependency file $(DEPEND_MK)..."
589	@echo "# Generated dependency rules" > $(DEPEND_MK);
590	@echo "# " >> $(DEPEND_MK);
591ifneq ($(strip $(ETHREAD_LIB_SRC)),)
592	@echo "# ethread lib objects..." >> $(DEPEND_MK);
593ifeq ($(USING_VC),yes)
594	$(V_at)$(DEP_CC) -MM $(THR_DEFS) $(DEP_FLAGS) $(ETHREAD_LIB_SRC) \
595		| $(SED_MD_DEPEND) >> $(DEPEND_MK)
596	$(V_at)$(DEP_CC) -MM $(THR_DEFS) $(DEP_FLAGS) $(ETHREAD_LIB_SRC) \
597		| $(SED_MDd_DEPEND) >> $(DEPEND_MK)
598else
599	$(V_at)$(DEP_CC) -MM $(THR_DEFS) $(DEP_FLAGS) $(ETHREAD_LIB_SRC) \
600		| $(SED_r_DEPEND) >> $(DEPEND_MK)
601endif
602endif
603ifneq ($(strip $(ERTS_INTERNAL_LIB_SRCS)),)
604ifneq ($(strip $(ETHREAD_LIB_SRC)),)
605	@echo "# erts_internal_r lib objects..." >> $(DEPEND_MK);
606ifeq ($(USING_VC),yes)
607	$(V_at)$(DEP_CC) -MM $(THR_DEFS) $(DEP_FLAGS) $(ERTS_INTERNAL_LIB_SRCS) \
608		| $(SED_MD_DEPEND) >> $(DEPEND_MK)
609	$(V_at)$(DEP_CC) -MM $(THR_DEFS) $(DEP_FLAGS) $(ERTS_INTERNAL_LIB_SRCS) \
610		| $(SED_MDd_DEPEND) >> $(DEPEND_MK)
611else
612	$(V_at)$(DEP_CC) -MM $(THR_DEFS) $(DEP_FLAGS) $(ERTS_INTERNAL_LIB_SRCS) \
613		| $(SED_r_DEPEND) >> $(DEPEND_MK)
614endif
615endif
616	@echo "# erts_internal lib objects..." >> $(DEPEND_MK);
617ifeq ($(USING_VC),yes)
618	$(V_at)$(DEP_CC) -MM $(DEP_FLAGS) $(ERTS_INTERNAL_LIB_SRCS) \
619		| $(SED_MD_DEPEND) >> $(DEPEND_MK)
620	$(V_at)$(DEP_CC) -MM $(DEP_FLAGS) $(ERTS_INTERNAL_LIB_SRCS) \
621		| $(SED_MDd_DEPEND) >> $(DEPEND_MK)
622else
623	$(V_at)$(DEP_CC) -MM $(DEP_FLAGS) $(ERTS_INTERNAL_LIB_SRCS) \
624		| $(SED_DEPEND) >> $(DEPEND_MK)
625endif
626endif
627ifneq ($(strip $(ERTS_LIB_SRCS)),)
628ifeq ($(USING_VC),yes)
629	@echo "# erts_MD lib objects..." >> $(DEPEND_MK);
630	$(V_at)$(DEP_CC) -MM $(THR_DEFS) $(DEP_FLAGS) $(ERTS_LIB_SRCS) \
631		| $(SED_MD_DEPEND) >> $(DEPEND_MK)
632	@echo "# erts_MDd lib objects..." >> $(DEPEND_MK);
633	$(V_at)$(DEP_CC) -MM $(THR_DEFS) $(DEP_FLAGS) $(ERTS_LIB_SRCS) \
634		| $(SED_MDd_DEPEND) >> $(DEPEND_MK)
635	@echo "# erts_MT lib objects..." >> $(DEPEND_MK);
636	$(V_at)$(DEP_CC) -MM $(THR_DEFS) $(DEP_FLAGS) $(ERTS_LIB_SRCS) \
637		| $(SED_MT_DEPEND) >> $(DEPEND_MK)
638	@echo "# erts_MTd lib objects..." >> $(DEPEND_MK);
639	$(V_at)$(DEP_CC) -MM $(THR_DEFS) $(DEP_FLAGS) $(ERTS_LIB_SRCS) \
640		| $(SED_MTd_DEPEND) >> $(DEPEND_MK)
641	@echo "# erts_internal_r lib objects..." >> $(DEPEND_MK);
642	$(V_at)$(DEP_CC) -MM $(THR_DEFS) $(DEP_FLAGS) $(ERTS_INTERNAL_LIB_SRCS) \
643		| $(SED_MD_DEPEND) >> $(DEPEND_MK)
644	@echo "# erts_internal_r.debug lib objects..." >> $(DEPEND_MK);
645	$(V_at)$(DEP_CC) -MM $(THR_DEFS) $(DEP_FLAGS) $(ERTS_INTERNAL_LIB_SRCS) \
646		| $(SED_MDd_DEPEND) >> $(DEPEND_MK)
647else
648ifneq ($(strip $(ETHREAD_LIB_SRC)),)
649	@echo "# erts_r lib objects..." >> $(DEPEND_MK);
650	$(V_at)$(DEP_CC) -MM $(THR_DEFS) $(DEP_FLAGS) $(ERTS_LIB_SRCS) \
651		| $(SED_r_DEPEND) >> $(DEPEND_MK)
652endif
653	@echo "# erts lib objects..." >> $(DEPEND_MK);
654	$(V_at)$(DEP_CC) -MM $(DEP_FLAGS) $(ERTS_LIB_SRCS) \
655		| $(SED_DEPEND) >> $(DEPEND_MK)
656endif
657endif
658	@echo "# EOF" >> $(DEPEND_MK);
659
660ifneq ($(ERTS_SKIP_DEPEND),true)
661ifneq ($(MAKECMDGOALS),clean)
662-include $(DEPEND_MK)
663endif
664endif
665
666# eof
667