cbcc2bc0edbff022d72699f5010a991ee435036c
[reactos.git] / reactos / tools / rbuild / backend / mingw / linkers / ld.mak
1 # -exclude-all-symbols disables autoexporting all symbols *if none were found* (either in a DEF file or using __declspec(dllexport)
2 LDFLAG_DLL:=-shared -exclude-all-symbols
3 LDFLAG_DRIVER:=-shared --subsystem=native -exclude-all-symbols
4 LDFLAG_NOSTDLIB:=-nostartfiles -nostdlib
5 LDFLAG_CONSOLE:=--subsystem=console
6 LDFLAG_WINDOWS:=--subsystem=windows
7 LDFLAG_NATIVE:=--subsystem=native
8
9 #~ #(module, objs, deps, ldflags, output, def, libs, entry, base)
10 #(module, objs, deps, ldflags, output, def, libs, entry, base, extralibs)
11 define RBUILD_LINK
12
13 ifneq ($(6),)
14 ${call RBUILD_intermediate_dir,$(5)}$$(SEP)lib${call RBUILD_name,$(5)}.a: $(6) | ${call RBUILD_intermediate_path,$(5)}
15 $$(ECHO_IMPLIB)
16 $${dlltool} --def $(6) --kill-at --output-lib=$$@
17
18 ${call RBUILD_intermediate_dir,$(5)}$$(SEP)lib${call RBUILD_name,$(5)}.delayimp.a: $(6) | ${call RBUILD_intermediate_path,$(5)}
19 $$(ECHO_IMPLIB)
20 $${dlltool} --def $(6) --kill-at --output-delaylib=$$@
21
22 ${call RBUILD_intermediate_path_noext,$(5)}.exp: $(6) | ${call RBUILD_intermediate_path,$(5)}
23 $$(ECHO_IMPLIB)
24 $${dlltool} --def $(6) --kill-at --output-exp=$$@
25
26 $(1)_CLEANFILES+=\
27 ${call RBUILD_intermediate_dir,$(5)}$$(SEP)lib$(notdir $(5)).a \
28 ${call RBUILD_intermediate_dir,$(5)}$$(SEP)lib$(notdir $(5)).delayimp.a \
29 ${call RBUILD_intermediate_path_noext,$(5)}.exp
30 endif
31
32 # TODO: refactor this out of here and into rules.mak
33 ${call RBUILD_intermediate_dir,$(5)}$$(SEP)$(1)_objs.rsp: $(2) $$(if $(6),${call RBUILD_intermediate_path_noext,$(5)}.exp) $(3) | ${call RBUILD_intermediate_dir,$(5)}
34 $$(ECHO_RSP)
35 -@$${rm} $$@ 2>$$(NUL)
36 $${cp} $$(NUL) $$@ >$$(NUL)
37 $$(foreach obj,$(2) $$(if $(6),${call RBUILD_intermediate_path_noext,$(5)}.exp),$$(Q)echo $$(QUOTE)$$(subst \,\\,$$(obj))$$(QUOTE)>>$$@$$(NL))
38
39 $(1)_CLEANFILES+=${call RBUILD_intermediate_dir,$(5)}$$(SEP)$(1)_objs.rsp
40
41 $(5): ${call RBUILD_intermediate_dir,$(5)}$$(SEP)$(1)_objs.rsp $(7) $(3) $$(RSYM_TARGET) $$(PEFIXUP_TARGET) | ${call RBUILD_dir,$(5)}
42 $$(ECHO_LD)
43 #~ $${ld} --entry=$(8) --image-base=$(9) @${call RBUILD_intermediate_dir,$(5)}$$(SEP)$(1)_objs.rsp $(7) ${call RBUILD_ldflags,$(1),$(4)} -o $$@
44 $${ld} --entry=$(8) --image-base=$(9) @${call RBUILD_intermediate_dir,$(5)}$$(SEP)$(1)_objs.rsp --start-group $(10) $(7) --end-group ${call RBUILD_ldflags,$(1),$(4)} -o $$@
45 ifneq ($(or $(6),$$(MODULETYPE$$($(1)_TYPE)_KMODE)),)
46 $$(ECHO_PEFIXUP)
47 $$(Q)$$(PEFIXUP_TARGET) $$@ $(if $(6),-exports) $$(if $$(MODULETYPE$($(1)_TYPE)_KMODE),-sections)
48 endif
49 ifeq ($(ROS_BUILDMAP),full)
50 $$(ECHO_OBJDUMP)
51 $${objdump} -d -S $$@ > ${call RBUILD_output_path_noext,$(5)}.map
52 else
53 ifeq ($(ROS_BUILDMAP),yes)
54 $$(ECHO_NM)
55 $${nm} --numeric-sort $$@ > ${call RBUILD_output_path_noext,$(5)}.map
56 endif
57 endif
58 ifeq ($(ROS_BUILDNOSTRIP),yes)
59 $$(ECHO_CP)
60 $${cp} $(5) $(basename $(5)).nostrip$(suffix $(5)) 1>$(NUL)
61 endif
62 ifneq ($(ROS_GENERATE_RSYM),no)
63 $$(ECHO_RSYM)
64 $$(Q)$$(RSYM_TARGET) $$@ $$@
65 endif
66 ifeq ($(ROS_LEAN_AND_MEAN),yes)
67 $$(ECHO_STRIP)
68 $${strip} -s -x -X $$@
69 endif
70
71 ifneq ($(ROS_BUILDMAP),)
72 $(1)_CLEANFILES+=${call RBUILD_output_path_noext,$(5)}.map
73 endif
74
75 ifeq ($(ROS_BUILDNOSTRIP),yes)
76 $(1)_CLEANFILES+=$(basename $(5)).nostrip$(suffix $(5))
77 endif
78
79 endef
80
81 #~ #(module, def, deps, ldflags, libs, entry, base)
82 #~ RBUILD_LINK_RULE=${call RBUILD_LINK,$(1),$(value $(1)_OBJS),$(3),$(4),$(value $(1)_TARGET),$(2),$(5) $(value $(1)_LIBS) $(5),$(6),$(7)}
83 #(module, def, deps, ldflags, libs, entry, base, extralibs)
84 RBUILD_LINK_RULE=${call RBUILD_LINK,$(1),$(value $(1)_OBJS),$(3),$(4),$(value $(1)_TARGET),$(2),$(value $(1)_LIBS),$(6),$(7),$(5)}