1#
2#  Copyright 2001-2009 Texas Instruments - http://www.ti.com/
3# 
4#  Licensed under the Apache License, Version 2.0 (the "License");
5#  you may not use this file except in compliance with the License.
6#  You may obtain a copy of the License at
7# 
8#     http://www.apache.org/licenses/LICENSE-2.0
9# 
10#  Unless required by applicable law or agreed to in writing, software
11#  distributed under the License is distributed on an "AS IS" BASIS,
12#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13#  See the License for the specific language governing permissions and
14#  limitations under the License.
15
16#
17#  dspbridge/mpu_api/make/build.mk
18#
19#  DSP-BIOS Bridge build rules.
20
21# ALL PATHS IN MAKEFILE MUST BE RELATIVE TO ITS DIRECTORY
22
23CDEFS       += $(CMDDEFS) # Add command line definitions
24CDEFS       += $(PROCFAMILY) # Processor Family e.g. 3430
25CDEFS	    += $(CMDDEFS_START) # Definitions from start.mk
26#   ----------------------------------------------------------
27#   REMOVE LEADING AND TRAILING SPACES FROM MAKEFILE MACROS
28#   ----------------------------------------------------------
29
30TARGETNAME  := $(strip $(TARGETNAME))
31TARGETTYPE  := $(strip $(TARGETTYPE))
32SUBMODULES  := $(strip $(SUBMODULES))
33SOURCES     := $(strip $(SOURCES))
34INCLUDES    := $(strip $(INCLUDES))
35LIBINCLUDES := $(strip $(LIBINCLUDES))
36
37SH_SONAME   := $(strip $(SH_SONAME))
38ST_LIBS     := $(strip $(ST_LIBS))
39SH_LIBS     := $(strip $(SH_LIBS))
40
41CFLAGS      := $(strip $(CFLAGS))
42CDEFS       := $(strip $(CDEFS))
43EXEC_ARGS   := $(strip $(EXEC_ARGS))
44ST_LIB_ARGS := $(strip $(ST_LIB_ARGS))
45SH_LIB_ARGS := $(strip $(SH_LIB_ARGS))
46
47#   ----------------------------------------------------------
48#   COMPILER OPTIONS
49#   ----------------------------------------------------------
50
51# Preprocessor : dependency file generation
52ifndef NODEPENDS
53ifndef nodepends
54CFLAGS += -MD
55endif
56endif
57
58#   Overall
59CFLAGS += -pipe
60#   Preprocessor
61CFLAGS +=
62#   Debugging
63ifeq ($(BUILD),deb)
64CFLAGS += -g
65else
66CFLAGS += -fomit-frame-pointer
67endif
68#   Warnings
69CFLAGS += -Wall  -Wno-trigraphs -Werror-implicit-function-declaration #-Wno-format
70#   Optimizations
71#CFLAGS += -O2 -fno-strict-aliasing
72#CFLAGS += -Os -fno-strict-aliasing
73CFLAGS += -fno-strict-aliasing
74#   Machine dependent
75
76ifeq ($(PROCFAMILY),OMAP_3430)
77CFLAGS += -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -march=armv7-a -msoft-float -Uarm -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR($(basename $(TARGETNAME)))" -D"KBUILD_MODNAME=KBUILD_STR($(basename $(TARGETNAME)))"  -DMODULE -D__LINUX_ARM_ARCH__=7 
78endif
79
80ifeq ($(PROCFAMILY),OMAP_4430)
81CFLAGS += -mapcs -mno-sched-prolog -mabi=aapcs-linux -mno-thumb-interwork -march=armv7-a -msoft-float -Uarm -D"KBUILD_STR(s)=\#s" -D"KBUILD_BASENAME=KBUILD_STR($(basename $(TARGETNAME)))" -D"KBUILD_MODNAME=KBUILD_STR($(basename $(TARGETNAME)))"  -DMODULE -D__LINUX_ARM_ARCH__=7
82endif
83
84#   Code generation
85CFLAGS += -fno-common
86#   Macros
87CFLAGS += -DLINUX $(addprefix -D, $(CDEFS))
88
89ifdef __KERNEL__
90CFLAGS      += -D__KERNEL__  -fno-builtin
91endif
92
93#   ----------------------------------------------------------
94#   OBJECTS
95#   ----------------------------------------------------------
96
97BUILDDIR    = .obj/
98
99# setup the target - check the given type - make sure we have the
100# correct suffix on it
101# TARGETNAME should not have a suffix on it - give an error if it does
102#ifneq ($(suffix $(TARGETNAME)),)
103#   $(error TARGETNAME can not have a suffix)
104#endif
105ifeq ($(TARGETTYPE),SH_LIB)
106   TARGET      := $(basename $(TARGETNAME)).so
107else
108ifeq ($(TARGETTYPE),MODULE)
109   TARGET      := $(basename $(TARGETNAME)).o
110   TARGETKO    := $(addsuffix .ko,$(basename $(TARGET)))
111   TARGETMOD   := $(addsuffix .mod,$(basename $(TARGET)))
112else
113ifeq ($(TARGETTYPE),ST_LIB)
114   TARGET      := $(basename $(TARGETNAME)).a
115else
116ifeq ($(TARGETTYPE),EXEC)
117   TARGET      := $(basename $(TARGETNAME)).out
118else
119ifneq ($(TARGETTYPE),)
120TARGET         := $(error Invalid TARGETTYPE)
121endif
122endif
123endif
124endif
125endif
126
127#LIBINCLUDES += $(TARGETDIR) $(TGTROOT)/lib $(TGTROOT)/usr/lib
128LIBINCLUDES += $(TARGETDIR)/lib $(TARGETDIR)/usr/lib 
129SRCDIRS :=  $(sort $(dir $(SOURCES)))
130OBJDIRS :=  $(addprefix $(BUILDDIR),$(SRCDIRS)) $(BUILDDIR)
131
132BASEOBJ := $(addsuffix .o,$(basename $(SOURCES)))
133OBJECTS := $(addprefix $(BUILDDIR), $(BASEOBJ))
134
135ST_LIBNAMES := $(addsuffix .a, $(addprefix lib, $(ST_LIBS)))
136DL_LIBNAMES := $(addsuffix .so, $(addprefix lib, $(SH_LIBS)))
137
138vpath %.a $(LIBINCLUDES) $(TGTROOT)/lib $(TGTROOT)/usr/lib
139vpath %.so $(LIBINCLUDES) $(TGTROOT)/lib $(TGTROOT)/usr/lib
140
141#   ----------------------------------------------------------
142#   BUILD ARGUMENTS
143#   ----------------------------------------------------------
144
145MAPFILE := -Wl,-Map,$(TARGET).map
146INCPATH := $(addprefix -I, . $(INCLUDES)) $(LINUXINCLUDE)
147LIBPATH := $(addprefix -L, $(LIBINCLUDES))
148LIBFILE := $(addprefix -l, $(ST_LIBS) $(SH_LIBS)) $(LIB_OBJS)
149
150ifeq ($(TARGETTYPE),SH_LIB)
151CFLAGS += -fpic
152TARGETARGS := $(SH_LIB_ARGS) -nostartfiles -nodefaultlibs -nostdlib -shared -Wl
153ifneq ($(SH_SONAME),)
154TARGETARGS += -Wl,-soname,$(SH_SONAME)
155endif
156endif
157
158ifeq ($(TARGETTYPE),MODULE)
159TARGETARGS := $(SH_LIB_ARGS) -nostartfiles -nodefaultlibs -nostdlib -Wl,-r
160ifneq ($(SH_SONAME),)
161TARGETARGS += -Wl,-soname,$(SH_SONAME)
162endif
163endif
164
165ifeq ($(TARGETTYPE),ST_LIB)
166TARGETARGS := $(ST_LIB_ARGS) -nostartfiles -nodefaultlibs -nostdlib -Wl,-r
167endif
168
169ifeq ($(TARGETTYPE),EXEC)
170TARGETARGS := $(EXEC_ARGS)
171endif
172
173.PHONY  :   all $(SUBMODULES) clean cleantrg SHELLERR Debug
174
175#   ==========================================================
176#   all
177#   ==========================================================
178all :  $(CHECKSHELL) $(SUBMODULES)
179
180#   ==========================================================
181#   Make submodules
182#   ==========================================================
183$(SUBMODULES):
184ifndef NORECURSE
185ifndef norecurse
186	$(MAKE) -C $@ $(filter-out $(SUBMODULES),$(MAKECMDGOALS))
187endif
188endif
189
190ifneq ($(TARGETTYPE),)
191
192# if this is driver module level , build KO file too
193ifneq ($(TOPLEVEL),)
194all :  $(OBJDIRS) $(TARGETKO)
195else
196all :  $(OBJDIRS) $(TARGET)
197endif
198
199#   ==========================================================
200#   Create directories
201#   ==========================================================
202$(OBJDIRS) $(TARGETDIR) :
203	@$(call MKDIR, $@)
204
205#   ==========================================================
206#   Product 2.6.x kernel module based on target
207#   ==========================================================
208
209# Link module .o with vermagic .o
210$(TARGETKO): $(TARGETMOD).o $(TARGET) 
211	$(LD) -EL -r -o $@ $^ 
212
213# Compile vermagic
214$(TARGETMOD).o: $(TARGETMOD).c 
215	$(CC) -c $(TARGETARGS) $(CFLAGS) $(INCPATH) -o $@ $<
216
217# Generate Module vermagic
218$(TARGETMOD).c: $(TARGET) 
219	$(MODPOST) $(TARGET)
220# removed - need to be done as a pre-step to building
221#	$(MAKE) -C $(KRNLSRC) modules	
222
223#   ==========================================================
224#   Build target
225#   ==========================================================
226$(TARGET):$(OBJECTS) $(ST_LIBNAMES) $(DL_LIBNAMES)
227#   @$(SHELLCMD) echo Building $@
228#	$(CC) $(TARGETARGS) $(CFLAGS) $(LIBPATH) $(MAPFILE) -o $@ $(BASEOBJ) $(LIBFILE)
229#	$(CC) $(TARGETARGS) $(CFLAGS) $(LIBPATH) $(MAPFILE) -o $@ $(OBJECTS) $(LIBFILE)
230ifeq ($(TARGETTYPE),ST_LIB)
231	$(AR) r $@ $(OBJECTS)
232else
233	$(CC) $(TARGETARGS) $(CFLAGS) $(LIBPATH) $(MAPFILE) -o $@ $(OBJECTS) $(LIBFILE)
234endif
235
236#   ==========================================================
237#   Compile .c file
238#   ==========================================================
239$(BUILDDIR)%.o:%.c
240#   echo Compiling $(patsubst $(BUILDDIR)%.o,%.c, $@)
241	$(CC) -c $(CFLAGS) $(INCPATH) -o $@ $(patsubst $(BUILDDIR)%.o,%.c, $@)
242
243#   ==========================================================
244#   Compile .S file
245#   ==========================================================
246$(BUILDDIR)%.o:%.S
247#   echo Compiling $(patsubst $(BUILDDIR)%.o,%.S, $@)
248	$(CC) -c $(CFLAGS) $(INCPATH) -o $@ $(patsubst $(BUILDDIR)%.o,%.S, $@)
249
250endif   # ifneq ($(TARGETTYPE),)
251
252#   ----------------------------------------------------------
253#   install - install the files
254#   ----------------------------------------------------------
255install:: $(TARGETDIR) $(SUBMODULES) $(TARGET)
256ifdef HOSTRELEASE
257ifdef SH_SONAME
258	$(INSTALL) -D $(TARGET) $(TARGETDIR)/$(HOSTRELEASE)/$(SH_SONAME)
259	$(RM) -f $(TARGETDIR)/$(HOSTRELEASE)/$(TARGET)
260	ln -s $(SH_SONAME) $(TARGETDIR)/$(HOSTRELEASE)/$(TARGET)
261else
262ifneq ($(TOPLEVEL),)
263	$(INSTALL) -D $(TARGETKO) $(TARGETDIR)/$(HOSTRELEASE)/$(TARGETKO)
264else
265	$(INSTALL) -D $(TARGET) $(TARGETDIR)/$(HOSTRELEASE)/$(TARGET)
266endif
267endif
268endif
269ifdef 0 # removed - components shouldn't put things in the production fs
270ifdef ROOTFSRELEASE
271	$(call MKDIR, $(ROOTFSDIR)/$(ROOTFSRELEASE))
272ifdef SH_SONAME
273	$(STRIP) --strip-unneeded -xgo $(ROOTFSDIR)/$(ROOTFSRELEASE)/$(SH_SONAME) $(TARGET)
274	$(RM) -f $(ROOTFSDIR)/$(ROOTFSRELEASE)/$(TARGET)
275	ln -s $(SH_SONAME) $(ROOTFSDIR)/$(ROOTFSRELEASE)/$(TARGET)
276else
277ifneq ($(TOPLEVEL),)
278	$(STRIP) --strip-unneeded -xgo $(ROOTFSDIR)/$(ROOTFSRELEASE)/$(TARGETKO) $(TARGETKO)
279else
280	$(STRIP) --strip-unneeded -xgo $(ROOTFSDIR)/$(ROOTFSRELEASE)/$(TARGET) $(TARGET)
281endif
282endif
283endif
284endif
285
286#   ----------------------------------------------------------
287#   clean - Remove build directory and target files
288#   Linux : Removes object and dependency files in build folder
289#   DOS   : Removes object dirs in build folder
290#   ----------------------------------------------------------
291clean : $(SUBMODULES)
292ifneq ($(TARGETTYPE),)
293ifneq ($(OBJECTS),)
294	- $(call RM,-f $(OBJECTS))
295	- $(call RM,-f $(OBJECTS:.o=.d))
296	- $(call RMDIR,-f $(BUILDDIR))
297endif
298	- $(call RM,-f $(TARGET))
299	- $(call RM,-f $(TARGET).map)
300	- $(call RM,-f $(TARGETKO))
301	- $(call RM,-f $(TARGETMOD).c)
302	- $(call RM,-f $(TARGETMOD).o)
303	- $(call RM,-f $(TARGETMOD).d)
304ifneq ($(TOPLEVEL),)
305	- @$(call RM,-f $(TARGETKO))
306	- @$(call RM,-f $(TARGETMOD).c)
307	- @$(call RM,-f $(TARGETMOD).o)
308	- @$(call RM,-f $(TARGETMOD).d)
309endif
310endif
311
312cleantrg : $(SUBMODULES)
313ifneq ($(TARGETTYPE),)
314	- @$(call RM, $(TARGET))
315	- @$(call RM, $(TARGET).map)
316ifneq ($(TOPLEVEL),)
317	- @$(call RM, $(TARGETKO))
318	- @$(call RM, $(TARGETMOD).c)
319	- @$(call RM, $(TARGETMOD).o)
320	- @$(call RM, $(TARGETMOD).d)
321endif
322endif
323
324#   ----------------------------------------------------------
325#   Include dependency files generated by preprocessor.
326#
327#   Dependency files are placed in main object directory because
328#   dependent files' paths for same source file varies with the
329#   directory from where gmake is run
330#   ----------------------------------------------------------
331ifndef NODEPENDS
332ifndef nodepends
333ifneq ($(OBJECTS),)
334-include $(OBJECTS:.o=.d)
335endif
336endif
337endif
338
339#   ----------------------------------------------------------
340#   Generate fatal error if make variable SHELL is incorrect
341#   ----------------------------------------------------------
342SHELLERR::
343	@$(SHELLCMD) echo Fatal error: SHELL set to $(SHELL) instead of $(MYSHELL)
344	@$(SHELLCMD) echo set $(MYSHELL) to correct path and CASE SENSITIVE FILE NAME and EXTENSTION
345	@$(SHELLCMD) echo of your command shell
346	$(ERR)
347
348
349#   ----------------------------------------------------------
350#   For debugging script
351#   ----------------------------------------------------------
352Debug::$(SUBMODULES)
353	@$(SHELLCMD) echo SHELL: $(SHELL)
354	@$(SHELLCMD) echo
355	@$(SHELLCMD) echo CDEFS: $(CDEFS)
356	@$(SHELLCMD) echo
357	@$(SHELLCMD) echo CONFIG_SHELL: $(CONFIG_SHELL)
358	@$(SHELLCMD) echo
359	@$(SHELLCMD) echo CURDIR: $(CURDIR)
360	@$(SHELLCMD) echo
361	@$(SHELLCMD) echo SRCDIRS: $(SRCDIRS)
362	@$(SHELLCMD) echo
363	@$(SHELLCMD) echo OBJDIRS: $(OBJDIRS)
364	@$(SHELLCMD) echo
365	@$(SHELLCMD) echo OBJECTS: $(OBJECTS)
366	@$(SHELLCMD) echo
367	@$(SHELLCMD) echo BUILDDIR: $(BUILDDIR)
368	@$(SHELLCMD) echo
369	@$(SHELLCMD) echo TARGETDIR TARGETNAME: $(TARGET)
370	@$(SHELLCMD) echo
371	@$(SHELLCMD) echo MAKEDIR: $(MAKEDIR)
372	@$(SHELLCMD) echo
373	@$(SHELLCMD) echo INCLUDES: $(INCLUDES)
374	@$(SHELLCMD) echo
375	@$(SHELLCMD) echo DL_LIBNAMES: $(DL_LIBNAMES)
376	@$(SHELLCMD) echo
377	@$(SHELLCMD) echo LIBFILE: $(LIBFILE)
378	@$(SHELLCMD) echo
379
380