Initial Kbuild / Kconfig commit
[akaros.git] / kern / src / Makefrag
1 # Makefile fragment for ROS kernel.
2 # This is NOT a complete makefile;
3 # you must run GNU make in the top-level directory
4 # where the GNUmakefile is located.
5 #
6
7 KERN_SRC_DIR = $(KERN_DIR)/src
8 OBJDIRS += $(KERN_SRC_DIR)
9 KERN_CPIO = initramfs.cpio
10 KERN_CPIO_OBJ = $(KERN_CPIO).o
11 ifneq ($(EXT2_BDEV),)
12 EXT2_BDEV_OBJ_FULL = $(OBJDIR)/$(KERN_DIR)/$(shell basename $(EXT2_BDEV)).o
13 endif
14
15 # entry.S must be first, so that it's the first code in the text segment!!!
16 #
17 # We also snatch the use of a couple handy source files
18 # from the lib directory, to avoid gratuitous code duplication.
19 KERN_SRCFILES := $(KERN_ARCH_SRCFILES) \
20                  $(KERN_SRC_DIR)/init.c \
21                  $(KERN_SRC_DIR)/monitor.c \
22                  $(KERN_SRC_DIR)/printf.c \
23                  $(KERN_SRC_DIR)/sched.c \
24                  $(KERN_SRC_DIR)/printfmt.c \
25                  $(KERN_SRC_DIR)/smp.c \
26                  $(KERN_SRC_DIR)/multiboot.c \
27                  $(KERN_SRC_DIR)/readline.c \
28                  $(KERN_SRC_DIR)/string.c \
29                  $(KERN_SRC_DIR)/atomic.c \
30                  $(KERN_SRC_DIR)/colored_caches.c \
31                  $(KERN_SRC_DIR)/page_alloc.c \
32                  $(KERN_SRC_DIR)/pmap.c \
33                  $(KERN_SRC_DIR)/env.c \
34                  $(KERN_SRC_DIR)/manager.c \
35                  $(KERN_SRC_DIR)/syscall.c \
36                  $(KERN_SRC_DIR)/time.c \
37                  $(KERN_SRC_DIR)/kfs.c \
38                  $(KERN_SRC_DIR)/process.c \
39                  $(KERN_SRC_DIR)/kmalloc.c \
40                  $(KERN_SRC_DIR)/hashtable.c \
41                  $(KERN_SRC_DIR)/schedule.c \
42                  $(KERN_SRC_DIR)/mm.c \
43                  $(KERN_SRC_DIR)/slab.c \
44                  $(KERN_SRC_DIR)/elf.c \
45                  $(KERN_SRC_DIR)/frontend.c \
46                  $(KERN_SRC_DIR)/vfs.c \
47                  $(KERN_SRC_DIR)/radix.c \
48                  $(KERN_SRC_DIR)/umem.c \
49                  $(KERN_SRC_DIR)/devfs.c \
50                  $(KERN_SRC_DIR)/blockdev.c \
51                  $(KERN_SRC_DIR)/ext2fs.c \
52                  $(KERN_SRC_DIR)/testing.c \
53                  $(KERN_SRC_DIR)/pagemap.c \
54                  $(KERN_SRC_DIR)/kthread.c \
55                  $(KERN_SRC_DIR)/eth_audio.c \
56                  $(KERN_SRC_DIR)/net.c \
57                  $(KERN_SRC_DIR)/event.c \
58                  $(KERN_SRC_DIR)/alarm.c \
59                  $(KERN_SRC_DIR)/kdebug.c \
60                  $(KERN_SRC_DIR)/ucq.c \
61                  $(KERN_SRC_DIR)/console.c \
62                  $(KERN_SRC_DIR)/trap.c \
63                  $(KERN_SRC_DIR)/socket.c \
64                  $(KERN_SRC_DIR)/net/udp.c \
65                  $(KERN_SRC_DIR)/net/tcp.c \
66                  $(KERN_SRC_DIR)/net/ip.c \
67                  $(KERN_SRC_DIR)/net/pbuf.c \
68                  $(KERN_SRC_DIR)/net/tcp_out.c \
69                  $(KERN_SRC_DIR)/net/tcp_in.c \
70                  $(KERN_SRC_DIR)/net/timers.c \
71                  $(KERN_SRC_DIR)/net/nic_common.c \
72                  $(KERN_SRC_DIR)/arsc.c
73
74 # Only build files if they exist.
75 KERN_SRCFILES := $(wildcard $(KERN_SRCFILES))
76
77 KERN_LDFLAGS   := $(KERN_LDFLAGS) -L$(OBJDIR)/$(KERN_DIR) \
78                   -T $(KERN_ARCH_SRC_DIR)/kernel.ld
79
80 KERN_OBJFILES  := $(patsubst $(KERN_DIR)/%.c, \
81                              $(OBJDIR)/$(KERN_DIR)/%.o, \
82                              $(KERN_SRCFILES))
83 KERN_OBJFILES  := $(patsubst $(KERN_DIR)/%.S, \
84                              $(OBJDIR)/$(KERN_DIR)/%.o, \
85                              $(KERN_OBJFILES))
86
87 KERN_LDDEPENDS := $(KERN_OBJFILES) $(ARCH_DIR)/$(TARGET_ARCH)/kernel.ld \
88                   $(OBJDIR)/$(KERN_DIR)/libivykern.a \
89                   $(OBJDIR)/$(KERN_DIR)/$(KERN_CPIO_OBJ) \
90                   $(EXT2_BDEV_OBJ_FULL)
91
92 KERN_LDLIBS    := -livykern
93
94 KERN_GCC_LIB   ?= $(GCC_LIB)
95
96 KERN_INITRAMFS_FILES := $(shell mkdir -p $(INITRAMFS_PATHS); find $(INITRAMFS_PATHS))
97
98 $(OBJDIR)/$(KERN_DIR)/$(KERN_CPIO) initramfs: $(KERN_INITRAMFS_FILES)
99         @echo Building initramfs:
100         @if [ "$(INITRAMFS_BIN)" != "" ]; then \
101         sh $(INITRAMFS_BIN); \
102     fi
103         $(V)for i in $(INITRAMFS_PATHS); do cd $$i; \
104         echo Adding $$i to initramfs...; \
105         find -L . | cpio --quiet -oH newc > \
106              $(TOP_DIR)/$(OBJDIR)/$(KERN_DIR)/$(KERN_CPIO); \
107         cd $$OLDPWD; \
108     done;
109
110 LD_EMULATION := $(shell $(OBJDUMP) -i | grep -v BFD | grep ^[a-z] | head -n1)
111 LD_ARCH := $(shell $(OBJDUMP) -i | grep -v BFD | grep "^  [a-z]" | head -n1)
112
113 $(OBJDIR)/$(KERN_DIR)/$(KERN_CPIO_OBJ): $(OBJDIR)/$(KERN_DIR)/$(KERN_CPIO)
114         $(V)$(OBJCOPY) -I binary -B $(LD_ARCH) -O $(LD_EMULATION) $^ $@
115
116 $(EXT2_BDEV_OBJ_FULL): $(EXT2_BDEV)
117         $(V)$(OBJCOPY) -I binary -B $(LD_ARCH) -O $(LD_EMULATION) $^ $@
118
119 $(OBJDIR)/$(KERN_DIR)/%.o: $(KERN_DIR)/%.c
120         @echo + cc [KERN] $<
121         @mkdir -p $(@D)
122         $(V)$(CC) $(KERN_CFLAGS) -c -o $@ $<
123
124 $(OBJDIR)/$(KERN_DIR)/%.o: $(KERN_DIR)/%.S
125         @echo + as [KERN] $<
126         @mkdir -p $(@D)
127         $(V)$(CC) $(KERN_CFLAGS) -D__ASSEMBLER__ -c -o $@ $<
128
129 $(OBJDIR)/$(KERN_DIR)/kernel: $(KERN_LDDEPENDS)
130         @echo + ld [KERN] $@
131         $(V)$(LD) -o $@ $(KERN_LDFLAGS) $(KERN_OBJFILES) $(KERN_LDLIBS) \
132                         $(KERN_GCC_LIB) $(OBJDIR)/$(KERN_DIR)/$(KERN_CPIO_OBJ) \
133                         $(EXT2_BDEV_OBJ_FULL)
134         $(V)$(OBJDUMP) -S $@ > $@.asm
135         $(V)$(NM) -n $@ > $@.sym
136
137 all: $(OBJDIR)/$(KERN_DIR)/kernel
138