| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame^] | 1 | #  | 
 | 2 | # Copyright (C) 2002 Jeff Dike (jdike@karaya.com) | 
 | 3 | # Licensed under the GPL | 
 | 4 | # | 
 | 5 |  | 
 | 6 | ARCH_DIR := arch/um | 
 | 7 | OS := $(shell uname -s) | 
 | 8 | # We require bash because the vmlinux link and loader script cpp use bash | 
 | 9 | # features. | 
 | 10 | SHELL := /bin/bash | 
 | 11 |  | 
 | 12 | filechk_gen_header = $< | 
 | 13 |  | 
 | 14 | core-y			+= $(ARCH_DIR)/kernel/		\ | 
 | 15 | 			   $(ARCH_DIR)/drivers/		\ | 
 | 16 | 			   $(ARCH_DIR)/os-$(OS)/ | 
 | 17 |  | 
 | 18 | # Have to precede the include because the included Makefiles reference them. | 
 | 19 | SYMLINK_HEADERS := archparam.h system.h sigcontext.h processor.h ptrace.h \ | 
 | 20 | 	arch-signal.h module.h vm-flags.h | 
 | 21 | SYMLINK_HEADERS := $(foreach header,$(SYMLINK_HEADERS),include/asm-um/$(header)) | 
 | 22 |  | 
 | 23 | # XXX: The "os" symlink is only used by arch/um/include/os.h, which includes | 
 | 24 | # ../os/include/file.h | 
 | 25 | # | 
 | 26 | # These are cleaned up during mrproper. Please DO NOT fix it again, this is | 
 | 27 | # the Correct Thing(tm) to do! | 
 | 28 | ARCH_SYMLINKS = include/asm-um/arch $(ARCH_DIR)/include/sysdep $(ARCH_DIR)/os \ | 
 | 29 | 	$(SYMLINK_HEADERS) $(ARCH_DIR)/include/uml-config.h | 
 | 30 |  | 
 | 31 | GEN_HEADERS += $(ARCH_DIR)/include/task.h $(ARCH_DIR)/include/kern_constants.h | 
 | 32 |  | 
 | 33 | um-modes-$(CONFIG_MODE_TT) += tt | 
 | 34 | um-modes-$(CONFIG_MODE_SKAS) += skas | 
 | 35 |  | 
 | 36 | MODE_INCLUDE	+= $(foreach mode,$(um-modes-y),\ | 
 | 37 | 		   -I$(srctree)/$(ARCH_DIR)/kernel/$(mode)/include) | 
 | 38 |  | 
 | 39 | MAKEFILES-INCL	+= $(foreach mode,$(um-modes-y),\ | 
 | 40 | 		   $(srctree)/$(ARCH_DIR)/Makefile-$(mode)) | 
 | 41 |  | 
 | 42 | ifneq ($(MAKEFILES-INCL),) | 
 | 43 |   include $(MAKEFILES-INCL) | 
 | 44 | endif | 
 | 45 |  | 
 | 46 | ARCH_INCLUDE	:= -I$(ARCH_DIR)/include | 
 | 47 | SYS_DIR		:= $(ARCH_DIR)/include/sysdep-$(SUBARCH) | 
 | 48 |  | 
 | 49 | include $(srctree)/$(ARCH_DIR)/Makefile-$(SUBARCH) | 
 | 50 |  | 
 | 51 | core-y += $(SUBARCH_CORE) | 
 | 52 | libs-y += $(SUBARCH_LIBS) | 
 | 53 |  | 
 | 54 | # -Derrno=kernel_errno - This turns all kernel references to errno into | 
 | 55 | # kernel_errno to separate them from the libc errno.  This allows -fno-common | 
 | 56 | # in CFLAGS.  Otherwise, it would cause ld to complain about the two different | 
 | 57 | # errnos. | 
 | 58 |  | 
 | 59 | CFLAGS += $(CFLAGS-y) -D__arch_um__ -DSUBARCH=\"$(SUBARCH)\" \ | 
 | 60 | 	$(ARCH_INCLUDE) $(MODE_INCLUDE) | 
 | 61 |  | 
 | 62 | USER_CFLAGS := $(patsubst -I%,,$(CFLAGS)) | 
 | 63 | USER_CFLAGS := $(patsubst -D__KERNEL__,,$(USER_CFLAGS)) $(ARCH_INCLUDE) \ | 
 | 64 | 	$(MODE_INCLUDE) $(ARCH_USER_CFLAGS) | 
 | 65 | CFLAGS += -Derrno=kernel_errno -Dsigprocmask=kernel_sigprocmask | 
 | 66 | CFLAGS += $(call cc-option,-fno-unit-at-a-time,) | 
 | 67 |  | 
 | 68 | #This will adjust *FLAGS accordingly to the platform. | 
 | 69 | include $(srctree)/$(ARCH_DIR)/Makefile-os-$(OS) | 
 | 70 |  | 
 | 71 | # These are needed for clean and mrproper, since in that case .config is not | 
 | 72 | # included; the values here are meaningless | 
 | 73 |  | 
 | 74 | CONFIG_NEST_LEVEL ?= 0 | 
 | 75 | CONFIG_KERNEL_HALF_GIGS ?= 0 | 
 | 76 |  | 
 | 77 | SIZE = (($(CONFIG_NEST_LEVEL) + $(CONFIG_KERNEL_HALF_GIGS)) * 0x20000000) | 
 | 78 |  | 
 | 79 | ifeq ($(CONFIG_MODE_SKAS), y) | 
 | 80 | $(SYS_HEADERS) : $(ARCH_DIR)/include/skas_ptregs.h | 
 | 81 | endif | 
 | 82 |  | 
 | 83 | .PHONY: linux | 
 | 84 |  | 
 | 85 | all: linux | 
 | 86 |  | 
 | 87 | linux: vmlinux | 
 | 88 | 	ln -f $< $@ | 
 | 89 |  | 
 | 90 | define archhelp | 
 | 91 |   echo '* linux		- Binary kernel image (./linux) - for backward' | 
 | 92 |   echo '		   compatibility only, this creates a hard link to the' | 
 | 93 |   echo '		   real kernel binary, the the "vmlinux" binary you' | 
 | 94 |   echo '		   find in the kernel root.' | 
 | 95 | endef | 
 | 96 |  | 
 | 97 | $(shell cd $(ARCH_DIR) && ln -sf Kconfig_$(SUBARCH) Kconfig_arch) | 
 | 98 |  | 
 | 99 | prepare: $(ARCH_SYMLINKS) $(SYS_HEADERS) $(GEN_HEADERS) \ | 
 | 100 | 	$(ARCH_DIR)/kernel/vmlinux.lds.S | 
 | 101 |  | 
 | 102 | LINK-$(CONFIG_LD_SCRIPT_STATIC) += -static | 
 | 103 | LINK-$(CONFIG_LD_SCRIPT_DYN) += -Wl,-rpath,/lib | 
 | 104 |  | 
 | 105 | LD_SCRIPT-$(CONFIG_LD_SCRIPT_STATIC) := uml.lds.S | 
 | 106 | LD_SCRIPT-$(CONFIG_LD_SCRIPT_DYN) := dyn.lds.S | 
 | 107 |  | 
 | 108 | CPP_MODE-$(CONFIG_MODE_TT) := -DMODE_TT | 
 | 109 | CONFIG_KERNEL_STACK_ORDER ?= 2 | 
 | 110 | STACK_SIZE := $(shell echo $$[ 4096 * (1 << $(CONFIG_KERNEL_STACK_ORDER)) ] ) | 
 | 111 |  | 
 | 112 | ifndef START | 
 | 113 |   START = $$(($(TOP_ADDR) - $(SIZE))) | 
 | 114 | endif | 
 | 115 |  | 
 | 116 | CPPFLAGS_vmlinux.lds = $(shell echo -U$(SUBARCH) \ | 
 | 117 | 	-DSTART=$(START) -DELF_ARCH=$(ELF_ARCH) \ | 
 | 118 | 	-DELF_FORMAT=\"$(ELF_FORMAT)\" $(CPP_MODE-y) \ | 
 | 119 | 	-DKERNEL_STACK_SIZE=$(STACK_SIZE)) | 
 | 120 |  | 
 | 121 | #The wrappers will select whether using "malloc" or the kernel allocator. | 
 | 122 | LINK_WRAPS = -Wl,--wrap,malloc -Wl,--wrap,free -Wl,--wrap,calloc | 
 | 123 |  | 
 | 124 | CFLAGS_vmlinux = $(LINK-y) $(LINK_WRAPS) | 
 | 125 | define cmd_vmlinux__ | 
 | 126 | 	$(CC) $(CFLAGS_vmlinux) -o $@ \ | 
 | 127 | 	-Wl,-T,$(vmlinux-lds) $(vmlinux-init) \ | 
 | 128 | 	-Wl,--start-group $(vmlinux-main) -Wl,--end-group \ | 
 | 129 | 	-L/usr/lib -lutil \ | 
 | 130 | 	$(filter-out $(vmlinux-lds) $(vmlinux-init) $(vmlinux-main) \ | 
 | 131 | 	FORCE ,$^) ; rm -f linux | 
 | 132 | endef | 
 | 133 |  | 
 | 134 | #When cleaning we don't include .config, so we don't include | 
 | 135 | #TT or skas makefiles and don't clean skas_ptregs.h. | 
 | 136 | CLEAN_FILES += linux x.i gmon.out $(ARCH_DIR)/include/uml-config.h \ | 
 | 137 | 	$(GEN_HEADERS) $(ARCH_DIR)/include/skas_ptregs.h | 
 | 138 |  | 
 | 139 | MRPROPER_FILES += $(SYMLINK_HEADERS) $(ARCH_SYMLINKS) \ | 
 | 140 | 	$(addprefix $(ARCH_DIR)/kernel/,$(KERN_SYMLINKS)) $(ARCH_DIR)/os \ | 
 | 141 | 	$(ARCH_DIR)/Kconfig_arch | 
 | 142 |  | 
 | 143 | archclean: | 
 | 144 | 	$(Q)$(MAKE) $(clean)=$(ARCH_DIR)/util | 
 | 145 | 	@find . \( -name '*.bb' -o -name '*.bbg' -o -name '*.da' \ | 
 | 146 | 		-o -name '*.gcov' \) -type f -print | xargs rm -f | 
 | 147 |  | 
 | 148 | #We need to re-preprocess this when the symlink dest changes. | 
 | 149 | #So we touch it when needed. | 
 | 150 | $(ARCH_DIR)/kernel/vmlinux.lds.S: FORCE | 
 | 151 | 	$(Q)if [ "$(shell readlink $@)" != "$(LD_SCRIPT-y)" ]; then \ | 
 | 152 | 		echo '  SYMLINK $@'; \ | 
 | 153 | 		ln -sf $(LD_SCRIPT-y) $@; \ | 
 | 154 | 		touch $@; \ | 
 | 155 | 	fi; | 
 | 156 |  | 
 | 157 | $(SYMLINK_HEADERS): | 
 | 158 | 	@echo '  SYMLINK $@' | 
 | 159 | 	$(Q)cd $(TOPDIR)/$(dir $@) ; \ | 
 | 160 | 	ln -sf $(basename $(notdir $@))-$(SUBARCH)$(suffix $@) $(notdir $@) | 
 | 161 |  | 
 | 162 | include/asm-um/arch: | 
 | 163 | 	@echo '  SYMLINK $@' | 
 | 164 | 	$(Q)cd $(TOPDIR)/include/asm-um && ln -sf ../asm-$(SUBARCH) arch | 
 | 165 |  | 
 | 166 | $(ARCH_DIR)/include/sysdep: | 
 | 167 | 	@echo '  SYMLINK $@' | 
 | 168 | 	$(Q)cd $(ARCH_DIR)/include && ln -sf sysdep-$(SUBARCH) sysdep | 
 | 169 |  | 
 | 170 | $(ARCH_DIR)/os: | 
 | 171 | 	@echo '  SYMLINK $@' | 
 | 172 | 	$(Q)cd $(ARCH_DIR) && ln -sf os-$(OS) os | 
 | 173 |  | 
 | 174 | # Generated files | 
 | 175 | define filechk_umlconfig | 
 | 176 | 	sed 's/ CONFIG/ UML_CONFIG/' | 
 | 177 | endef | 
 | 178 |  | 
 | 179 | $(ARCH_DIR)/include/uml-config.h : include/linux/autoconf.h | 
 | 180 | 	$(call filechk,umlconfig) | 
 | 181 |  | 
 | 182 | $(ARCH_DIR)/include/task.h: $(ARCH_DIR)/util/mk_task | 
 | 183 | 	$(call filechk,gen_header) | 
 | 184 |  | 
 | 185 | $(ARCH_DIR)/include/user_constants.h: $(ARCH_DIR)/os/util/mk_user_constants | 
 | 186 | 	$(call filechk,gen_header) | 
 | 187 |  | 
 | 188 | $(ARCH_DIR)/include/kern_constants.h: $(ARCH_DIR)/util/mk_constants | 
 | 189 | 	$(call filechk,gen_header) | 
 | 190 |  | 
 | 191 | $(ARCH_DIR)/include/skas_ptregs.h: $(ARCH_DIR)/kernel/skas/util/mk_ptregs | 
 | 192 | 	$(call filechk,gen_header) | 
 | 193 |  | 
 | 194 | $(ARCH_DIR)/os/util/mk_user_constants: $(ARCH_DIR)/os/util FORCE ; | 
 | 195 |  | 
 | 196 | $(ARCH_DIR)/util/mk_task $(ARCH_DIR)/util/mk_constants: $(ARCH_DIR)/include/user_constants.h $(ARCH_DIR)/util \ | 
 | 197 | 	FORCE ; | 
 | 198 |  | 
 | 199 | $(ARCH_DIR)/kernel/skas/util/mk_ptregs: $(ARCH_DIR)/kernel/skas/util FORCE ; | 
 | 200 |  | 
 | 201 | $(ARCH_DIR)/util: scripts_basic $(SYS_DIR)/sc.h FORCE | 
 | 202 | 	$(Q)$(MAKE) $(build)=$@ | 
 | 203 |  | 
 | 204 | $(ARCH_DIR)/kernel/skas/util: scripts_basic FORCE | 
 | 205 | 	$(Q)$(MAKE) $(build)=$@ | 
 | 206 |  | 
 | 207 | $(ARCH_DIR)/os/util: scripts_basic FORCE | 
 | 208 | 	$(Q)$(MAKE) $(build)=$@ | 
 | 209 |  | 
 | 210 | export SUBARCH USER_CFLAGS OS |