]> rtime.felk.cvut.cz Git - l4.git/blob - l4/mk/lib.mk
update
[l4.git] / l4 / mk / lib.mk
1 # -*- Makefile -*-
2 #
3 # DROPS (Dresden Realtime OPerating System) Component
4 #
5 # Makefile-Template for library directories
6 #
7 # install.inc is used, see there for further documentation
8 # binary.inc is used, see there for further documentation
9
10
11 ifeq ($(origin _L4DIR_MK_LIB_MK),undefined)
12 _L4DIR_MK_LIB_MK=y
13
14 ROLE = lib.mk
15
16 # define INSTALLDIRs prior to including install.inc, where the install-
17 # rules are defined. Same for INSTALLDIR.
18 ifeq ($(MODE),host)
19 INSTALLDIR_LIB          ?= $(DROPS_STDDIR)/lib/host
20 INSTALLDIR_LIB_LOCAL    ?= $(OBJ_BASE)/lib/host
21 else
22 INSTALLDIR_LIB          ?= $(DROPS_STDDIR)/lib/$(subst -,/,$(SYSTEM))
23 INSTALLDIR_LIB_LOCAL    ?= $(OBJ_BASE)/lib/$(subst -,/,$(SYSTEM))
24 endif
25 INSTALLFILE_LIB         ?= $(INSTALL) -m 644 $(1) $(2)
26 INSTALLFILE_LIB_LOCAL   ?= $(LN) -sf $(call absfilename,$(1)) $(2)
27
28 INSTALLFILE             = $(INSTALLFILE_LIB)
29 INSTALLDIR              = $(INSTALLDIR_LIB)
30 INSTALLFILE_LOCAL       = $(INSTALLFILE_LIB_LOCAL)
31 INSTALLDIR_LOCAL        = $(INSTALLDIR_LIB_LOCAL)
32
33 # our mode
34 MODE                    ?= lib
35
36 # sanity check for proper mode
37 ifneq ($(filter-out lib host,$(MODE)),)
38 $(error MODE=$(MODE) not possible when building libraries)
39 endif
40
41 # all libraries are built using the wraped utcb-getter
42 CPPFLAGS          += -DL4SYS_USE_UTCB_WRAP=1
43
44 # include all Makeconf.locals, define common rules/variables
45 include $(L4DIR)/mk/Makeconf
46 include $(L4DIR)/mk/binary.inc
47 $(GENERAL_D_LOC): $(L4DIR)/mk/lib.mk
48
49 ifneq ($(SYSTEM),) # if we a system, really build
50
51 TARGET_LIB        := $(TARGET) $(TARGET_$(OSYSTEM))
52 TARGET_SHARED     := $(filter     %.so,$(TARGET_LIB))
53 TARGET_STANDARD   := $(filter-out %.so,$(TARGET_LIB))
54
55 TARGET_LIB_NE     := $(TARGET_NE) $(TARGET_NE_$(OSYSTEM))
56 TARGET_SHARED_NE  := $(addprefix noexc/,$(filter     %.so,$(TARGET_LIB_NE)))
57 TARGET_STANDARD_NE:= $(addprefix noexc/,$(filter-out %.so,$(TARGET_LIB_NE)))
58
59 TARGET_PROFILE  := $(patsubst %.a,%.pr.a,\
60                         $(filter $(BUILD_PROFILE),$(TARGET_STANDARD)))
61 TARGET_PROFILE_SHARED := $(filter %.so,$(TARGET_PROFILE))
62 TARGET_PIC      := $(patsubst %.a,%.p.a,\
63                         $(filter $(BUILD_PIC),$(TARGET_STANDARD)))
64 TARGET_PIC_NE   := $(addprefix noexc/,$(TARGET_PIC))
65 TARGET_PROFILE_PIC := $(patsubst %.a,%.p.a,\
66                         $(filter $(BUILD_PIC),$(TARGET_PROFILE)))
67 TARGET  += $(TARGET_$(OSYSTEM)) $(TARGET_PIC)
68 TARGET  += $(TARGET_PIC_NE) $(TARGET_SHARED_NE) $(TARGET_STANDARD_NE)
69 TARGET  += $(TARGET_PROFILE) $(TARGET_PROFILE_SHARED) $(TARGET_PROFILE_PIC)
70
71 # define some variables different for lib.mk and prog.mk
72 LDFLAGS += $(addprefix -L, $(PRIVATE_LIBDIR) $(PRIVATE_LIBDIR_$(OSYSTEM)) $(PRIVATE_LIBDIR_$@) $(PRIVATE_LIBDIR_$@_$(OSYSTEM)))
73 LDFLAGS += $(addprefix -L, $(if $(LINK_WITH_NOEXC_LIBS_$@),$(L4LIBDIR_NOEXC),$(L4LIBDIR_R-$(L4_MULTITHREADED))))
74 LDFLAGS += $(LIBCLIBDIR)
75 LDFLAGS_SO ?= -shared -nostdlib
76
77 BID_LDFLAGS_FOR_LINKING_DYN_LD  = $(LDFLAGS)
78 BID_LDFLAGS_FOR_GCC_DYN         = $(filter     -static -shared -nostdlib -Wl$(BID_COMMA)% -L% -l%,$(LDFLAGS))
79 BID_LDFLAGS_FOR_LD_DYN          = $(filter-out -static -shared -nostdlib -Wl$(BID_COMMA)% -L% -l%,$(LDFLAGS))
80 BID_LDFLAGS_FOR_LINKING_DYN_GCC = $(addprefix -Wl$(BID_COMMA),$(BID_LDFLAGS_FOR_LD_DYN)) $(BID_LDFLAGS_FOR_GCC_DYN)
81
82
83 LDSCRIPT       = $(LDS_so)
84 LDSCRIPT_INCR ?= /dev/null
85 CRT0           = $(CRTI_so) $(CRTBEGIN_so) $(CRT1_so)
86 CRTN           = $(CRTN_so)
87
88 # install.inc eventually defines rules for every target
89 include $(L4DIR)/mk/install.inc
90
91 ifeq ($(NOTARGETSTOINSTALL),)
92 PC_LIBS     ?= $(patsubst lib%.so,-l%,$(TARGET_SHARED) \
93                $(patsubst lib%.a,-l%,$(TARGET_STANDARD)))
94
95 PC_FILENAME  ?= $(PKGNAME)
96 PC_FILENAMES ?= $(PC_FILENAME)
97
98 PC_FILES     := $(foreach pcfile,$(PC_FILENAMES),$(OBJ_BASE)/pc/$(pcfile).pc)
99
100 # 1: basename
101 # 2: pcfilename
102 get_cont = $(if $($(1)_$(2)),$($(1)_$(2)),$($(1)))
103
104 $(OBJ_BASE)/pc/%.pc: $(GENERAL_D_LOC)
105         $(if $(filter-out -l%,$(call get_cont,PC_LIBS,$*)),$(error PC_LIBS contains invalid library list: $(call get_cont,PC_LIBS,$*); Only -l statements allowed.),@true)
106         $(VERBOSE)$(call generate_pcfile,$*,$@,$(call get_cont,CONTRIB_INCDIR,$*),$(call get_cont,PC_LIBS,$*),$(call get_cont,REQUIRES_LIBS,$*))
107
108 all:: $(PC_FILES)
109
110 endif
111
112 DEPS    += $(foreach file,$(TARGET), $(dir $(file)).$(notdir $(file)).d)
113
114 $(filter-out $(LINK_INCR) %.so %.o.a %.o.pr.a, $(TARGET)):%.a: $(OBJS)
115         @$(AR_MESSAGE)
116         $(VERBOSE)$(MKDIR) $(basename $@)
117         $(VERBOSE)$(RM) $@
118         $(VERBOSE)$(AR) crs $@ $(OBJS)
119         @$(BUILT_MESSAGE)
120
121 # shared lib
122 $(filter %.so, $(TARGET)):%.so: $(OBJS) $(CRTN) $(CRT0) $(CRTP) $(LIBDEPS)
123         @$(LINK_SHARED_MESSAGE)
124         $(VERBOSE)$(MKDIR) $(basename $@)
125         $(VERBOSE)$(call MAKEDEP,$(LD)) $(LD) -m $(LD_EMULATION) \
126            -o $@ $(LDFLAGS_SO) $(addprefix -T,$(LDSCRIPT)) $(CRTP) \
127            $(OBJS) $(REQUIRES_LIBS_LIST) $(LDFLAGS) \
128            $(GCCLIB) $(GCCLIB_EH) $(CRTN)
129         @$(BUILT_MESSAGE)
130
131 # build an object file (which looks like a lib to a later link-call), which
132 # is either later included as a whole or not at all (important for static
133 # constructors)
134 $(filter $(LINK_INCR) %.o.a %.o.pr.a, $(TARGET)):%.a: $(OBJS) $(LIBDEPS)
135         @$(LINK_PARTIAL_MESSAGE)
136         $(VERBOSE)$(MKDIR) $(basename $@)
137         $(VERBOSE)$(call MAKEDEP,$(LD)) $(LD) -m $(LD_EMULATION) \
138            -T$(LDSCRIPT_INCR) \
139            -o $@ -r $(OBJS) $(LDFLAGS)
140         $(if $(LINK_INCR_ONLYGLOBSYM_$@)$(LINK_INCR_ONLYGLOBSYMFILE_$@), \
141            $(VERBOSE)$(OBJCOPY) \
142            $(foreach f,$(LINK_INCR_ONLYGLOBSYMFILE_$@),--keep-global-symbols=$(f)) \
143            $(foreach f,$(LINK_INCR_ONLYGLOBSYM_$@),-G $(f)) \
144            $@)
145         @$(BUILT_MESSAGE)
146
147 endif   # architecture is defined, really build
148
149 .PHONY: all clean cleanall config help install oldconfig txtconfig
150 -include $(DEPSVAR)
151 help::
152         @echo "  all            - compile and install the libraries locally"
153 ifneq ($(SYSTEM),)
154         @echo "                   to $(INSTALLDIR_LOCAL)"
155 endif
156         @echo "  install        - compile and install the libraries globally"
157 ifneq ($(SYSTEM),)
158         @echo "                   to $(INSTALLDIR)"
159 endif
160         @echo "  scrub          - delete backup and temporary files"
161         @echo "  clean          - delete generated object files"
162         @echo "  cleanall       - delete all generated, backup and temporary files"
163         @echo "  help           - this help"
164         @echo
165 ifneq ($(SYSTEM),)
166         @echo "  libraries are: $(TARGET)"
167 else
168         @echo "  build for architectures: $(TARGET_SYSTEMS)"
169 endif
170
171 endif   # _L4DIR_MK_LIB_MK undefined