]> rtime.felk.cvut.cz Git - l4.git/blob - l4/Makefile
3b0019dffd8b2cd0f667735d14768780332c51dd
[l4.git] / l4 / Makefile
1 #
2 # GLOBAL Makefile for the whole L4 tree
3 #
4
5 L4DIR           ?= .
6
7 BUILD_DIRS    = tool pkg
8 install-dirs  = tool pkg
9 clean-dirs    = tool pkg doc
10 cleanall-dirs = tool pkg doc
11
12 BUILD_TOOLS     = gawk gcc g++ ld perl pkg-config
13
14 CMDS_WITHOUT_OBJDIR := help checkbuild up update check_build_tools
15
16 # our default target is all::
17 all::
18
19 #####################
20 # config-tool
21
22 DROPSCONF               = y
23 DROPSCONF_DEFCONFIG     ?= $(L4DIR)/mk/defconfig/config.x86
24 KCONFIG_FILE            = $(OBJ_BASE)/Kconfig.generated
25 KCONFIG_FILE_SRC        = $(L4DIR)/mk/Kconfig
26 DROPSCONF_CONFIG        = $(OBJ_BASE)/.kconfig.auto
27 DROPSCONF_CONFIG_H      = $(OBJ_BASE)/include/l4/bid_config.h
28 DROPSCONF_CONFIG_MK     = $(OBJ_BASE)/.config.all
29 DROPSCONF_DONTINC_MK    = y
30 DROPSCONF_HELPFILE      = $(L4DIR)/mk/config.help
31
32 # separation in "dependent" (ie opts the build output depends on) and
33 # "independent" (ie opts the build output does not depend on) opts
34 CONFIG_MK_INDEPOPTS     = CONFIG_BID_GENERATE_MAPFILE \
35                           CONFIG_DEPEND_VERBOSE \
36                           CONFIG_VERBOSE_SWITCH \
37                           CONFIG_BID_COLORED_PHASES CONFIG_HAVE_LDSO \
38                           CONFIG_INT_CPP_NAME_SWITCH BID_LIBGENDEP_PATHS CONFIG_INT_CPP_.*_NAME \
39                           CONFIG_INT_CXX_.*_NAME CONFIG_VERBOSE CONFIG_BID_STRIP_PROGS \
40                           CONFIG_INT_LD_NAME_SWITCH CONFIG_INT_LD_.*_NAME
41 CONFIG_MK_PLATFORM_OPTS = CONFIG_PLATFORM_.*
42 CONFIG_MK_REAL          = $(OBJ_BASE)/.config
43 CONFIG_MK_INDEP         = $(OBJ_BASE)/.config.indep
44 CONFIG_MK_PLATFORM      = $(OBJ_BASE)/.config.platform
45
46 INCLUDE_BOOT_CONFIG    := optional
47
48 ifneq ($(filter $(CMDS_WITHOUT_OBJDIR),$(MAKECMDGOALS)),)
49 IGNORE_MAKECONF_INCLUDE=1
50 endif
51
52 ifneq ($(B)$(BUILDDIR_TO_CREATE),)
53 IGNORE_MAKECONF_INCLUDE=1
54 endif
55
56 ifeq ($(IGNORE_MAKECONF_INCLUDE),)
57 ifneq ($(filter help config oldconfig,$(MAKECMDGOALS)),)
58 # tweek $(L4DIR)/mk/Makeconf to use the intermediate file
59 export BID_IGN_ROOT_CONF=y
60 BID_ROOT_CONF=$(DROPSCONF_CONFIG_MK)
61 endif
62
63 # $(L4DIR)/mk/Makeconf shouln't include Makeconf.local twice
64 MAKECONFLOCAL           = /dev/null
65 include $(L4DIR)/mk/Makeconf
66 export DROPS_STDDIR
67
68 # after having absfilename, we can export BID_ROOT_CONF
69 ifneq ($(filter config oldconfig gconfig nconfig xconfig, $(MAKECMDGOALS)),)
70 export BID_ROOT_CONF=$(call absfilename,$(OBJ_BASE))/.config.all
71 endif
72 endif
73
74 #####################
75 # rules follow
76
77 ifneq ($(strip $(B)),)
78 BUILDDIR_TO_CREATE := $(B)
79 endif
80 ifneq ($(strip $(BUILDDIR_TO_CREATE)),)
81 all:: check_build_tools
82         @echo "Creating build directory \"$(BUILDDIR_TO_CREATE)\"..."
83         @if [ -e "$(BUILDDIR_TO_CREATE)" ]; then        \
84                 echo "Already exists, aborting.";       \
85                 exit 1;                                 \
86         fi
87         @mkdir -p "$(BUILDDIR_TO_CREATE)"
88         @cp $(DROPSCONF_DEFCONFIG) $(BUILDDIR_TO_CREATE)/.kconfig
89         @$(MAKE) B= BUILDDIR_TO_CREATE= O=$(BUILDDIR_TO_CREATE) oldconfig
90         @echo "done."
91 else
92
93 all:: l4defs
94
95 endif
96
97
98
99 # some more dependencies
100 tool: $(DROPSCONF_CONFIG_MK)
101 pkg:  $(DROPSCONF_CONFIG_MK) tool
102
103 ifneq ($(CONFIG_BID_BUILD_DOC),)
104 install-dirs += doc
105 all:: doc
106 endif
107
108 up update:
109         $(VERBOSE)svn up -N
110         $(VERBOSE)svn up mk tool/gendep tool/kconfig tool/elf-patcher doc/source conf tool/lib tool/vim tool/bin
111         $(VERBOSE)$(MAKE) -C pkg up
112
113 tool pkg:
114         $(VERBOSE)if [ -r $@/Makefile ]; then PWD=$(PWD)/$@ $(MAKE) -C $@; fi
115
116 doc:
117         $(VERBOSE)if [ -r doc/source/Makefile ]; then PWD=$(PWD)/doc/source $(MAKE) -C doc/source; fi
118
119 cont:
120         $(VERBOSE)$(MAKE) -C pkg cont
121
122 .PHONY: all clean cleanall install up update doc
123 .PHONY: $(BUILD_DIRS) doc check_build_tools cont cleanfast
124
125 cleanall::
126         $(VERBOSE)rm -f *~
127
128 clean cleanall install::
129         $(VERBOSE)set -e; for i in $($@-dirs) ; do \
130           if [ -r $$i/Makefile -o -r $$i/GNUmakefile ] ; then \
131                 PWD=$(PWD)/$$i $(MAKE) -C $$i $@ ; fi ; done
132
133 cleanfast:
134         $(VERBOSE)$(RM) -r $(addprefix $(OBJ_BASE)/,bin include pkg doc ext-pkg pc lib l4defs.mk.inc l4defs.sh.inc) \
135                            $(IMAGES_DIR)
136
137
138 L4DEF_FILE_MK ?= $(OBJ_BASE)/l4defs.mk.inc
139 L4DEF_FILE_SH ?= $(OBJ_BASE)/l4defs.sh.inc
140
141 l4defs: $(L4DEF_FILE_MK) $(L4DEF_FILE_SH)
142
143 generate_l4defs_files = \
144         $(VERBOSE)tmpdir=$(OBJ_BASE)/l4defs.gen.dir &&                 \
145         mkdir -p $$tmpdir &&                                           \
146         echo "L4DIR = $(L4DIR_ABS)"                      > $$tmpdir/Makefile && \
147         echo "OBJ_BASE = $(OBJ_BASE)"                   >> $$tmpdir/Makefile && \
148         echo "L4_BUILDDIR = $(OBJ_BASE)"                >> $$tmpdir/Makefile && \
149         echo "SRC_DIR = $$tmpdir"                       >> $$tmpdir/Makefile && \
150         echo "PKGDIR_ABS = $(L4DIR_ABS)/l4defs.gen.dir" >> $$tmpdir/Makefile && \
151         cat $(L4DIR)/mk/export_defs.inc                 >> $$tmpdir/Makefile && \
152         PWD=$$tmpdir $(MAKE) -C $$tmpdir -f $$tmpdir/Makefile          \
153           CALLED_FOR=$(1) L4DEF_FILE_MK=$(L4DEF_FILE_MK) L4DEF_FILE_SH=$(L4DEF_FILE_SH) && \
154         $(RM) -r $$tmpdir
155
156 $(L4DEF_FILE_MK): $(BUILD_DIRS) $(DROPSCONF_CONFIG_MK) $(L4DIR)/mk/export_defs.inc
157         +$(call generate_l4defs_files,static)
158         +$(call generate_l4defs_files,shared)
159         +$(call generate_l4defs_files,sharedlib)
160
161 $(L4DEF_FILE_SH): $(L4DEF_FILE_MK)
162
163 regen_l4defs:
164         +$(call generate_l4defs_files,static)
165         +$(call generate_l4defs_files,shared)
166         +$(call generate_l4defs_files,sharedlib)
167
168 .PHONY: l4defs regen_l4defs
169
170 #####################
171 # config-rules follow
172
173 HOST_SYSTEM := $(shell uname | tr 'A-Z' 'a-z')
174 export HOST_SYSTEM
175
176 # it becomes a bit confusing now: 'make config' results in a config file, which
177 # must be postprocessed. This is done in config.inc. Then,
178 # we evaluate some variables that depend on the postprocessed config file.
179 # The variables are defined in mk/Makeconf, which sources Makeconf.bid.local.
180 # Hence, we have to 1) postprocess, 2) call make again to get the variables.
181 DROPSCONF_CONFIG_MK_POST_HOOK:: check_build_tools $(OBJ_DIR)/Makefile
182         # libgendep must be done before calling make with the local helper
183         $(VERBOSE)$(MAKE) libgendep
184         $(VERBOSE)$(MAKE) Makeconf.bid.local-helper || \
185                 (rm -f $(DROPSCONF_CONFIG_MK) $(CONFIG_MK_REAL) $(CONFIG_MK_INDEP); false)
186         $(VEROBSE)$(LN) -snf $(L4DIR_ABS) $(OBJ_BASE)/source
187         $(VERBOSE)$(MAKE) checkconf
188
189 define extract_var
190         $(1)=$$((cat $(2); echo printit:;                  \
191                  echo ' @echo $$($(3))') |                 \
192                 $(MAKE) --no-print-directory -f - printit)
193 endef
194
195 define create_kconfig
196         $(VERBOSE)echo "# vi:set ft=kconfig:" > $(1)
197         $(VERBOSE)echo "# This Kconfig is auto-generated." >> $(1)
198         $(VERBOSE)pt="";                                             \
199         while IFS="" read l; do                                      \
200           if [ "$$l" = "INSERT_PLATFORMS" ]; then                    \
201             for p in $(wildcard $(L4DIR)/conf/platforms/*.conf       \
202                                 $(L4DIR)/mk/platforms/*.conf); do    \
203               $(call extract_var,n,$$p,PLATFORM_NAME);               \
204               pn=$${p##*/};                                          \
205               pn=$${pn%.conf};                                       \
206               echo "config PLATFORM_TYPE_$${pn}" >> $(1);            \
207               echo "  bool \"$$n\"" >> $(1);                         \
208               pt="$$pt  default \"$$pn\" if PLATFORM_TYPE_$${pn}\n"; \
209               $(call extract_var,n,$$p,PLATFORM_ARCH);               \
210               dep="";                                                \
211               for a in $$n; do                                       \
212                 if [ -z "$$dep" ]; then                              \
213                   dep="  depends on BUILD_ARCH_$$a";                 \
214                 else                                                 \
215                   dep="$$dep || BUILD_ARCH_$$a";                     \
216                 fi;                                                  \
217               done;                                                  \
218               echo "$$dep" >> $(1);                                  \
219               echo "" >> $(1);                                       \
220             done;                                                    \
221           elif [ "$$l" = "INSERT_PLATFORM_TYPES" ]; then             \
222             echo "config PLATFORM_TYPE" >> $(1);                     \
223             echo "  string" >> $(1);                                 \
224             echo -e "$$pt" >> $(1);                                  \
225           else                                                       \
226             echo "$$l" >> $(1);                                      \
227           fi;                                                        \
228         done < $(2)
229 endef
230
231 $(KCONFIG_FILE): $(KCONFIG_FILE_SRC) Makefile $(wildcard $(L4DIR)/conf/platforms/*.conf $(L4DIR)/conf/platforms/*.conf)
232         +$(call create_kconfig,$@,$(KCONFIG_FILE_SRC))
233
234 checkconf:
235         $(VERBOSE)if [ ! -e $(GCCDIR)/include/stddef.h ]; then \
236           $(ECHO); \
237           $(ECHO) "$(GCCDIR) seems wrong (stddef.h not found)."; \
238           $(ECHO) "Does it exist?"; \
239           $(ECHO); \
240           exit 1; \
241         fi
242
243 # caching of some variables. Others are determined directly.
244 # The contents of the variables to cache is already defined in mk/Makeconf.
245 .PHONY: Makeconf.bid.local-helper Makeconf.bid.local-internal-names \
246         libgendep checkconf
247 ARCH = $(BUILD_ARCH)
248 CC := $(if $(filter sparc,$(ARCH)),$(if $(call GCCIS_sparc_leon_f),sparc-elf-gcc,$(CC)),$(CC))
249 LD := $(if $(filter sparc,$(ARCH)),$(if $(call GCCIS_sparc_leon_f),sparc-elf-ld,$(LD)),$(LD))
250 Makeconf.bid.local-helper:
251         $(VERBOSE)echo BUILD_SYSTEMS="$(strip $(ARCH)_$(CPU)            \
252                        $(ARCH)_$(CPU)-$(BUILD_ABI))" >> $(DROPSCONF_CONFIG_MK)
253         $(VERBOSE)$(foreach v, GCCDIR GCCLIB_HOST GCCLIB_EH GCCLIB_S_SO \
254                         GCCVERSION GCCMAJORVERSION GCCMINORVERSION      \
255                         GCCSUBVERSION GCC_HAS_ATOMICS                   \
256                         GCCNOSTACKPROTOPT LDVERSION GCCSYSLIBDIRS       \
257                         GCCFORTRANAVAIL                                 \
258                         $(if $(GCCNOFPU_$(ARCH)_f),GCCNOFPU_$(ARCH))    \
259                         $(if $(GCCIS_$(ARCH)_leon_f),GCCIS_$(ARCH)_leon),   \
260                         echo $(v)=$(call $(v)_f,$(ARCH))                \
261                         >>$(DROPSCONF_CONFIG_MK);)
262         $(VERBOSE)$(foreach v, crtbegin.o crtbeginS.o crtbeginT.o \
263                                crtendS.o crtend.o, \
264                         echo GCCLIB_FILE_$(v)=$(call GCCLIB_file_f,$(v))   \
265                         >>$(DROPSCONF_CONFIG_MK);)
266         $(VERBOSE)$(foreach v, LD_GENDEP_PREFIX, echo $v=$($(v)) >>$(DROPSCONF_CONFIG_MK);)
267         $(VERBOSE)echo "HOST_SYSTEM=$(HOST_SYSTEM)" >>$(DROPSCONF_CONFIG_MK)
268         $(VERBOSE)echo "COLOR_TERMINAL=$(shell if [ $$(tput colors || echo -1) = '-1' ]; then echo n; else echo y; fi)" >>$(DROPSCONF_CONFIG_MK)
269         $(VERBOSE)echo "LD_HAS_HASH_STYLE_OPTION=$(shell if $(LD) --help 2>&1 | grep -q ' --hash-style='; then echo y; else echo n; fi)" >>$(DROPSCONF_CONFIG_MK)
270         $(VERBOSE)# we need to call make again, because HOST_SYSTEM (set above) must be
271         $(VERBOSE)# evaluated for LD_PRELOAD to be set, which we need in the following
272         $(VERBOSE)$(MAKE) Makeconf.bid.local-internal-names
273         $(VERBOSE)sort <$(DROPSCONF_CONFIG_MK) >$(CONFIG_MK_REAL).tmp
274         $(VERBOSE)echo -e "# Automatically generated. Don't edit\n" >$(CONFIG_MK_INDEP)
275         $(VERBOSE)echo -e "# Automatically generated. Don't edit\n" >$(CONFIG_MK_PLATFORM)
276         $(VERBOSE)grep $(addprefix -e ^,$(CONFIG_MK_INDEPOPTS) )    <$(CONFIG_MK_REAL).tmp >>$(CONFIG_MK_INDEP)
277         $(VERBOSE)grep $(addprefix -e ^,$(CONFIG_MK_PLATFORM_OPTS)) <$(CONFIG_MK_REAL).tmp >>$(CONFIG_MK_PLATFORM)
278         $(VERBOSE)echo -e "# Automatically generated. Don't edit\n" >$(CONFIG_MK_REAL).tmp2
279         $(VERBOSE)grep -v $(addprefix -e ^,$$ # $(CONFIG_MK_INDEPOPTS) $(CONFIG_MK_PLATFORM_OPTS)) \
280                 <$(CONFIG_MK_REAL).tmp >>$(CONFIG_MK_REAL).tmp2
281         $(VERBOSE)echo -e 'include $(call absfilename,$(CONFIG_MK_INDEP))' >>$(CONFIG_MK_REAL).tmp2
282         $(VERBOSE)echo -e 'include $(call absfilename,$(CONFIG_MK_PLATFORM))' >>$(CONFIG_MK_REAL).tmp2
283         $(VERBOSE)if [ -e "$(CONFIG_MK_REAL)" ]; then                        \
284                     diff --brief -I ^COLOR_TERMINAL $(CONFIG_MK_REAL) $(CONFIG_MK_REAL).tmp2 || \
285                       mv $(CONFIG_MK_REAL).tmp2 $(CONFIG_MK_REAL);           \
286                   else                                                       \
287                     mv $(CONFIG_MK_REAL).tmp2 $(CONFIG_MK_REAL);             \
288                   fi
289         $(VERBOSE)$(RM) $(CONFIG_MK_REAL).tmp $(CONFIG_MK_REAL).tmp2
290
291 Makeconf.bid.local-internal-names:
292 ifneq ($(CONFIG_INT_CPP_NAME_SWITCH),)
293         $(VERBOSE) set -e; X="tmp.$$$$$$RANDOM.c" ; echo 'int main(void){}'>$$X ; \
294                 rm -f $$X.out ; $(LD_GENDEP_PREFIX) GENDEP_SOURCE=$$X \
295                 GENDEP_OUTPUT=$$X.out $(CC) $(CCXX_FLAGS) -c $$X -o $$X.o; \
296                 test -e $$X.out; echo INT_CPP_NAME=`cat $$X.out` \
297                         >>$(DROPSCONF_CONFIG_MK); \
298                 rm -f $$X $$X.{o,out};
299         $(VERBOSE)set -e; X="tmp.$$$$$$RANDOM.cc" ; echo 'int main(void){}'>$$X; \
300                 rm -f $$X.out; $(LD_GENDEP_PREFIX) GENDEP_SOURCE=$$X \
301                 GENDEP_OUTPUT=$$X.out $(CXX) -c $$X -o $$X.o; \
302                 test -e $$X.out; echo INT_CXX_NAME=`cat $$X.out` \
303                         >>$(DROPSCONF_CONFIG_MK); \
304                 rm -f $$X $$X.{o,out};
305 endif
306 ifneq ($(CONFIG_INT_LD_NAME_SWITCH),)
307         $(VERBOSE) set -e; echo INT_LD_NAME=$$($(LD) 2>&1 | perl -p -e 's,^(.+/)?(.+):.+,$$2,') >> $(DROPSCONF_CONFIG_MK)
308 endif
309         $(VERBOSE)emulations=$$(LANG= $(firstword $(LD)) --help |        \
310                                 grep -i "supported emulations:" |        \
311                                 sed -e 's/.*supported emulations: //') ; \
312         unset found_it;                                                  \
313         for e in $$emulations; do                                        \
314           for c in $(LD_EMULATION_CHOICE_$(ARCH)); do                    \
315             if [ "$$e" = "$$c" ]; then                                   \
316               echo LD_EMULATION=$$e >> $(DROPSCONF_CONFIG_MK);           \
317               found_it=1;                                                \
318               break;                                                     \
319             fi;                                                          \
320           done;                                                          \
321         done;                                                            \
322         if [ "$$found_it" != "1" ]; then                                 \
323           echo "No known ld emulation found"; exit 1;                    \
324         fi
325
326 libgendep:
327         $(VERBOSE)if [ ! -r tool/gendep/Makefile ]; then        \
328                     echo "=== l4/tool/gendep missing! ===";     \
329                     exit 1;                                     \
330                   fi
331         $(VERBOSE)PWD=$(PWD)/tool/gendep $(MAKE) -C tool/gendep
332
333 check_build_tools:
334         @unset mis;                                                \
335         for i in $(BUILD_TOOLS); do                                \
336           if ! command -v $$i >/dev/null 2>&1; then                \
337             [ -n "$$mis" ] && mis="$$mis ";                        \
338             mis="$$mis$$i";                                        \
339           fi                                                       \
340         done;                                                      \
341         if [ -n "$$mis" ]; then                                    \
342           echo -e "\033[1;31mProgram(s) \"$$mis\" not found, please install!\033[0m"; \
343           exit 1;                                                  \
344         else                                                       \
345           echo "All build tools checked ok.";                      \
346         fi
347
348 define common_envvars
349         ARCH="$(ARCH)" PLATFORM_TYPE="$(PLATFORM_TYPE)"
350 endef
351 define tool_envvars
352         L4DIR=$(L4DIR)                                           \
353         SEARCHPATH="$(MODULE_SEARCH_PATH):$(BUILDDIR_SEARCHPATH)"
354 endef
355 define set_ml
356         unset ml; ml=$(L4DIR_ABS)/conf/modules.list;             \
357            [ -n "$(MODULES_LIST)" ] && ml=$(MODULES_LIST)
358 endef
359 define entryselection
360         unset e;                                                 \
361            $(set_ml);                                            \
362            [ -n "$(ENTRY)"       ] && e="$(ENTRY)";              \
363            [ -n "$(E)"           ] && e="$(E)";                  \
364            if [ -z "$$e" ]; then                                 \
365              BACKTITLE="No entry given. Use 'make $@ E=entryname' to avoid menu." \
366                L4DIR=$(L4DIR) $(L4DIR)/tool/bin/entry-selector menu $$ml 2> $(OBJ_BASE)/.entry-selector.tmp; \
367              if [ $$? != 0 ]; then                               \
368                cat $(OBJ_BASE)/.entry-selector.tmp;              \
369                exit 1;                                           \
370              fi;                                                 \
371              e=$$(cat $(OBJ_BASE)/.entry-selector.tmp);          \
372              $(RM) $(OBJ_BASE)/.entry-selector.tmp;              \
373            fi
374 endef
375 define checkx86amd64build
376         $(VERBOSE)if [ "$(ARCH)" != "x86" -a "$(ARCH)" != "amd64" ]; then      \
377           echo "This mode can only be used with architectures x86 and amd64."; \
378           exit 1;                                                              \
379         fi
380 endef
381 define genimage
382         +$(VERBOSE)$(entryselection);                                     \
383         $(MKDIR) $(IMAGES_DIR);                                           \
384         PWD=$(PWD)/pkg/bootstrap/server/src $(common_envvars)             \
385             $(MAKE) -C pkg/bootstrap/server/src ENTRY="$$e"               \
386                     BOOTSTRAP_MODULES_LIST=$$ml $(1)                      \
387                     BOOTSTRAP_MODULE_PATH_BINLIB="$(BUILDDIR_SEARCHPATH)" \
388                     BOOTSTRAP_SEARCH_PATH="$(MODULE_SEARCH_PATH)"
389 endef
390
391 define switch_ram_base_func
392         echo "  ... Regenerating RAM_BASE settings"; set -e; \
393         echo "# File semi-automatically generated by 'make switch_ram_base'" > $(OBJ_BASE)/Makeconf.ram_base; \
394         echo "RAM_BASE := $(1)"                                             >> $(OBJ_BASE)/Makeconf.ram_base; \
395         PWD=$(PWD)/pkg/sigma0/server/src $(MAKE) RAM_BASE=$(1) -C pkg/sigma0/server/src;                      \
396         PWD=$(PWD)/pkg/moe/server/src    $(MAKE) RAM_BASE=$(1) -C pkg/moe/server/src;                         \
397         echo "RAM_BASE_SWITCH_OK := yes"                                    >> $(OBJ_BASE)/Makeconf.ram_base
398 endef
399
400 BUILDDIR_SEARCHPATH = $(OBJ_BASE)/bin/$(ARCH)_$(CPU):$(OBJ_BASE)/bin/$(ARCH)_$(CPU)/$(BUILD_ABI):$(OBJ_BASE)/lib/$(ARCH)_$(CPU):$(OBJ_BASE)/lib/$(ARCH)_$(CPU)/$(BUILD_ABI)
401
402 QEMU_ARCH_MAP_$(ARCH) = qemu-system-$(ARCH)
403 QEMU_ARCH_MAP_x86     = $(strip $(shell if qemu-system-i386 -version > /dev/null; then echo qemu-system-i386; else echo qemu; fi))
404 QEMU_ARCH_MAP_amd64   = qemu-system-x86_64
405 QEMU_ARCH_MAP_ppc32   = qemu-system-ppc
406
407 FASTBOOT_BOOT_CMD    ?= fastboot boot
408
409 check_and_adjust_ram_base:
410         $(VERBOSE)if [ -z "$(PLATFORM_RAM_BASE)" ]; then   \
411           echo "Platform \"$(PLATFORM_TYPE)\" not known."; \
412           exit 1;                                          \
413         fi
414         $(VERBOSE)if [ $$(($(RAM_BASE))) != $$(($(PLATFORM_RAM_BASE))) -o -z "$(RAM_BASE)" -o -z "$(RAM_BASE_SWITCH_OK)" ]; then \
415           echo "=========== Updating RAM_BASE for platform $(PLATFORM_TYPE) to $(PLATFORM_RAM_BASE) =========" ; \
416           $(call switch_ram_base_func,$(PLATFORM_RAM_BASE)); \
417         fi
418
419 listentries:
420         $(VERBOSE)$(set_ml); \
421           L4DIR=$(L4DIR) $(L4DIR)/tool/bin/entry-selector list $$ml
422
423 shellcodeentry:
424         $(VERBOSE)$(entryselection);                                      \
425          SHELLCODE="$(SHELLCODE)" $(common_envvars) $(tool_envvars)       \
426           $(L4DIR)/tool/bin/shell-entry $$ml "$$e"
427
428 elfimage: check_and_adjust_ram_base
429         $(call genimage,BOOTSTRAP_DO_UIMAGE= BOOTSTRAP_DO_RAW_IMAGE=)
430
431 uimage: check_and_adjust_ram_base
432         $(call genimage,BOOTSTRAP_DO_UIMAGE=y BOOTSTRAP_DO_RAW_IMAGE=)
433
434 rawimage: check_and_adjust_ram_base
435         $(call genimage,BOOTSTRAP_DO_UIMAGE= BOOTSTRAP_DO_RAW_IMAGE=y)
436
437 fastboot fastboot_rawimage: rawimage
438         $(VERBOSE)$(FASTBOOT_BOOT_CMD) $(IMAGES_DIR)/bootstrap.raw
439
440 fastboot_uimage: uimage
441         $(VERBOSE)$(FASTBOOT_BOOT_CMD) $(IMAGES_DIR)/bootstrap.uimage
442
443 ifneq ($(filter $(ARCH),x86 amd64),)
444 qemu:
445         $(VERBOSE)$(entryselection);                                      \
446          qemu=$(if $(QEMU_PATH),$(QEMU_PATH),$(QEMU_ARCH_MAP_$(ARCH)));   \
447          QEMU=$$qemu QEMU_OPTIONS="$(QEMU_OPTIONS)"                       \
448           $(tool_envvars) $(common_envvars)                               \
449           $(L4DIR)/tool/bin/qemu-x86-launch $$ml "$$e"
450 else
451 qemu: elfimage
452         $(VERBOSE)qemu=$(if $(QEMU_PATH),$(QEMU_PATH),$(QEMU_ARCH_MAP_$(ARCH))); \
453         if [ -z "$$qemu" ]; then echo "Set QEMU_PATH!"; exit 1; fi;              \
454         echo QEmu-cmd: $$qemu -kernel $(IMAGES_DIR)/bootstrap.elf $(QEMU_OPTIONS);    \
455         $$qemu -kernel $(IMAGES_DIR)/bootstrap.elf $(QEMU_OPTIONS)
456 endif
457
458 vbox: $(if $(VBOX_ISOTARGET),$(VBOX_ISOTARGET),grub2iso)
459         $(checkx86amd64build)
460         $(VERBOSE)if [ -z "$(VBOX_VM)" ]; then                                 \
461           echo "Need to set name of configured VirtualBox VM im 'VBOX_VM'.";   \
462           exit 1;                                                              \
463         fi
464         $(VERBOSE)VirtualBox                    \
465             --startvm $(VBOX_VM)                \
466             --cdrom $(IMAGES_DIR)/.current.iso  \
467             --boot d                            \
468             $(VBOX_OPTIONS)
469
470 kexec:
471         $(VERBOSE)$(entryselection);                        \
472          $(tool_envvars) $(common_envvars)                  \
473           $(L4DIR)/tool/bin/kexec-launch $$ml "$$e"
474
475 ux:
476         $(VERBOSE)if [ "$(ARCH)" != "x86" ]; then                   \
477           echo "This mode can only be used with architecture x86."; \
478           exit 1;                                                   \
479         fi
480         $(VERBOSE)$(entryselection);                                 \
481         $(tool_envvars)  $(common_envvars)                           \
482           $(if $(UX_GFX),UX_GFX="$(UX_GFX)")                         \
483           $(if $(UX_GFX_CMD),UX_GFX_CMD="$(UX_GFX_CMD)")             \
484           $(if $(UX_NET),UX_NET="$(UX_NET)")                         \
485           $(if $(UX_NET_CMD),UX_NET_CMD="$(UX_NET_CMD)")             \
486           $(if $(UX_GDB_CMD),UX_GDB_CMD="$(UX_GDB_CMD)")             \
487           $(L4DIR)/tool/bin/ux-launch $$ml "$$e" $(UX_OPTIONS)
488
489 GRUB_TIMEOUT ?= 0
490
491 define geniso
492         $(checkx86amd64build)
493         $(VERBOSE)$(entryselection);                                         \
494          $(MKDIR) $(IMAGES_DIR);                                             \
495          ISONAME=$(IMAGES_DIR)/$$(echo $$e | tr '[ A-Z]' '[_a-z]').iso;      \
496          $(tool_envvars) $(common_envvars)                                   \
497           $(L4DIR)/tool/bin/gengrub$(1)iso --timeout=$(GRUB_TIMEOUT) $$ml    \
498              $$ISONAME "$$e"                                                 \
499           && $(LN) -f $$ISONAME $(IMAGES_DIR)/.current.iso
500 endef
501
502 grub1iso:
503         $(call geniso,1)
504
505 grub2iso:
506         $(call geniso,2)
507
508 exportpack:
509         $(if $(EXPORTPACKTARGETDIR),, \
510           @echo Need to specific target directory as EXPORTPACKTARGETDIR=dir; exit 1)
511         $(VERBOSE)$(entryselection);                                      \
512          TARGETDIR=$(EXPORTPACKTARGETDIR);                                \
513          qemu=$(if $(QEMU_PATH),$(QEMU_PATH),$(QEMU_ARCH_MAP_$(ARCH)));   \
514          QEMU=$$qemu L4DIR=$(L4DIR)                                       \
515          $(tool_envvars) $(common_envvars)                                \
516           $(L4DIR)/tool/bin/genexportpack --timeout=$(GRUB_TIMEOUT)       \
517                                            $$ml $$TARGETDIR $$e;
518
519 help::
520         @echo
521         @echo "Image generation targets:"
522         @echo "  elfimage   - Generate an ELF image, containing all modules."
523         @echo "  rawimage   - Generate a raw image (memory dump), containing all modules."
524         @echo "  uimage     - Generate a uimage for u-boot, containing all modules."
525         @echo "  grub1iso   - Generate an ISO using GRUB1 in images/<name>.iso [x86, amd64]" 
526         @echo "  grub2iso   - Generate an ISO using GRUB2 in images/<name>.iso [x86, amd64]" 
527         @echo "  qemu       - Use Qemu to run 'name'." 
528         @echo "  exportpack - Export binaries with launch support." 
529         @echo "  vbox       - Use VirtualBox to run 'name'." 
530         @echo "  fastboot   - Call fastboot with the created rawimage."
531         @echo "  fastboot_rawimage - Call fastboot with the created rawimage."
532         @echo "  fastboot_uimage   - Call fastboot with the created uimage."
533         @echo "  ux         - Run 'name' under Fiasco/UX. [x86]" 
534         @echo "  kexec      - Issue a kexec call to start the entry." 
535         @echo " Add 'E=name' to directly select the entry without using the menu."
536         @echo " Modules are defined in conf/modules.list."
537
538 listplatforms:
539         $(VERBOSE)for p in $(wildcard $(L4DIR)/conf/platforms/*.conf    \
540                                       $(L4DIR)/mk/platforms/*.conf); do \
541           $(call extract_var,a,$$p,PLATFORM_ARCH);                      \
542           for ar in $$a; do                                             \
543             [ "$$ar" = "$(BUILD_ARCH)" ] && arch_hit=1;                 \
544           done;                                                         \
545           if [ -n "$$arch_hit" ]; then                                  \
546             $(call extract_var,n,$$p,PLATFORM_NAME);                    \
547             pn=$${p##*/};                                               \
548             pn=$${pn%.conf};                                            \
549             printf "%20s -- %s\n" $$pn "$$n";                           \
550           fi;                                                           \
551           unset arch_hit;                                               \
552         done
553
554
555 .PHONY: elfimage rawimage uimage qemu vbox ux switch_ram_base \
556         grub1iso grub2iso listentries shellcodeentry exportpack \
557         fastboot fastboot_rawimage fastboot_uimage \
558         check_and_adjust_ram_base listplatforms
559
560 switch_ram_base:
561         $(VERBOSE)$(call switch_ram_base_func,$(RAM_BASE))
562
563 checkbuild:
564         @if [ -z "$(CHECK_BASE_DIR)" ]; then                                  \
565           echo "Need to set CHECK_BASE_DIR variable";                         \
566           exit 1;                                                             \
567         fi
568         set -e; for i in $(if $(USE_CONFIGS),$(addprefix mk/defconfig/config.,$(USE_CONFIGS)),mk/defconfig/config.*); do \
569           p=$(CHECK_BASE_DIR)/$$(basename $$i);                               \
570           rm -rf $$p;                                                         \
571           mkdir -p $$p;                                                       \
572           cp $$i $$p/.kconfig;                                                \
573           $(MAKE) O=$$p oldconfig;                                            \
574           $(MAKE) O=$$p report;                                               \
575           $(MAKE) O=$$p tool;                                                 \
576           $(MAKE) O=$$p USE_CCACHE=$(USE_CCACHE) $(CHECK_MAKE_ARGS);          \
577           $(if $(CHCEK_REMOVE_OBJDIR),rm -rf $$p;)                            \
578         done
579
580 report:
581         @echo -e $(EMPHSTART)"============================================================="$(EMPHSTOP)
582         @echo -e $(EMPHSTART)" Note, this report might disclose private information"$(EMPHSTOP)
583         @echo -e $(EMPHSTART)" Please review (and edit) before sending it to public lists"$(EMPHSTOP)
584         @echo -e $(EMPHSTART)"============================================================="$(EMPHSTOP)
585         @echo
586         @echo "make -v:"
587         @make -v || true
588         @echo
589         @echo "CC: $(CC) -v:"
590         @$(CC) -v || true
591         @echo
592         @echo "CXX: $(CXX) -v:"
593         @$(CXX) -v || true
594         @echo
595         @echo "HOST_CC: $(HOST_CC) -v:"
596         @$(HOST_CC) -v || true
597         @echo
598         @echo "HOST_CXX: $(HOST_CXX) -v:"
599         @$(HOST_CXX) -v || true
600         @echo
601         @echo -n "ld: $(LD) -v: "
602         @$(LD) -v || true
603         @echo
604         @echo -n "perl -v:"
605         @perl -v || true
606         @echo
607         @echo -n "python -V: "
608         @python -V || true
609         @echo
610         @echo "svn --version: "
611         @svn --version || true
612         @echo
613         @echo "Shell is:"
614         @ls -la /bin/sh || true
615         @echo
616         @echo "uname -a: "; uname -a
617         @echo
618         @echo "Distribution"
619         @if [ -e "/etc/debian_version" ]; then                 \
620           if grep -qi ubuntu /etc/issue; then                  \
621             echo -n "Ubuntu: ";                                \
622             cat /etc/issue;                                    \
623           else                                                 \
624             echo -n "Debian: ";                                \
625           fi;                                                  \
626           cat /etc/debian_version;                             \
627         elif [ -e /etc/gentoo-release ]; then                  \
628           echo -n "Gentoo: ";                                  \
629           cat /etc/gentoo-release;                             \
630         elif [ -e /etc/SuSE-release ]; then                    \
631           echo -n "SuSE: ";                                    \
632           cat /etc/SuSE-release;                               \
633         elif [ -e /etc/fedora-release ]; then                  \
634           echo -n "Fedora: ";                                  \
635           cat /etc/fedora-release;                             \
636         elif [ -e /etc/redhat-release ]; then                  \
637           echo -n "Redhat: ";                                  \
638           cat /etc/redhat-release;                             \
639           [ -e /etc/redhat_version ]                           \
640             && echo "  Version: `cat /etc/redhat_version`";    \
641         elif [ -e /etc/slackware-release ]; then               \
642           echo -n "Slackware: ";                               \
643           cat /etc/slackware-release;                          \
644           [ -e /etc/slackware-version ]                        \
645             && echo "  Version: `cat /etc/slackware-version`"; \
646         elif [ -e /etc/mandrake-release ]; then                \
647           echo -n "Mandrake: ";                                \
648           cat /etc/mandrake-release;                           \
649         else                                                   \
650           echo "Unknown distribution";                         \
651         fi
652         @lsb_release -a || true
653         @echo
654         @echo "Running as PID"
655         @id -u || true
656         @echo
657         @echo "Archive information:"
658         @svn info || true
659         @git describe || true
660         @echo
661         @echo "CC       = $(CC) $(CCXX_FLAGS)"
662         @echo "CXX      = $(CXX) $(CCXX_FLAGS)"
663         @echo "HOST_CC  = $(HOST_CC)"
664         @echo "HOST_CXX = $(HOST_CXX)"
665         @echo "LD       = $(LD)"
666         @echo "Paths"
667         @echo "Current:   $$(pwd)"
668         @echo "L4DIR:     $(L4DIR)"
669         @echo "L4DIR_ABS: $(L4DIR_ABS)"
670         @echo "OBJ_BASE:  $(OBJ_BASE)"
671         @echo "OBJ_DIR:   $(OBJ_DIR)"
672         @echo
673         @for i in pkg \
674                   ../kernel/fiasco/src/kern/ia32 \
675                   ../tools/preprocess/src/preprocess; do \
676           if [ -e $$i ]; then \
677             echo Path $$i found ; \
678           else                \
679             echo PATH $$i IS NOT AVAILABLE; \
680           fi \
681         done
682         @echo
683         @echo Configuration:
684         @for i in $(OBJ_DIR)/.config.all $(OBJ_DIR)/.kconfig   \
685                   $(OBJ_DIR)/Makeconf.local                    \
686                   $(L4DIR_ABS)/Makeconf.local                  \
687                   $(OBJ_DIR)/conf/Makeconf.boot                \
688                   $(L4DIR_ABS)/conf/Makeconf.boot; do          \
689           if [ -e "$$i" ]; then                                \
690             echo "______start_______________________________:";\
691             echo "$$i:";                                       \
692             cat $$i;                                           \
693             echo "____________________________end___________"; \
694           else                                                 \
695             echo "$$i not found";                              \
696           fi                                                   \
697         done
698         @echo -e $(EMPHSTART)"============================================================="$(EMPHSTOP)
699         @echo -e $(EMPHSTART)" Note, this report might disclose private information"$(EMPHSTOP)
700         @echo -e $(EMPHSTART)" Please review (and edit) before sending it to public lists"$(EMPHSTOP)
701         @echo -e $(EMPHSTART)"============================================================="$(EMPHSTOP)
702
703 help::
704         @echo
705         @echo "Miscellaneous targets:"
706         @echo "  switch_ram_base RAM_BASE=0xaddr"
707         @echo "                   - Switch physical RAM base of build to 'addr'." 
708         @echo "  update           - Update working copy by using SVN." 
709         @echo "  cont             - Continue building after fixing a build error." 
710         @echo "  clean            - Call 'clean' target recursively." 
711         @echo "  cleanfast        - Delete all directories created during build." 
712         @echo "  report           - Print out host configuration information." 
713         @echo "  help             - Print this help text." 
714         @echo "  listplatforms    - List available platforms."