/ GNUmakefile
GNUmakefile
  1  MAKEFLAGS += -rR
  2  .SUFFIXES:
  3  
  4  override OUTPUT := gloaming
  5  
  6  ARCH := x86_64
  7  
  8  ifeq ($(filter $(ARCH),i386 x86_64),)
  9      $(error Architecture $(ARCH) not supported)
 10  endif
 11  
 12  PREFIX := /usr/local
 13  
 14  CC := cc
 15  CFLAGS := -g -O2 -pipe
 16  CPPFLAGS :=
 17  ifeq ($(ARCH),x86_64)
 18      NASMFLAGS := -F dwarf -g
 19  endif
 20  LDFLAGS :=
 21  
 22  ifneq ($(shell ( test '$(MAKECMDGOALS)' = clean || test '$(MAKECMDGOALS)' = distclean ); echo $$?),0)
 23      ifeq ($(shell ( ! test -d freestnd-c-hdrs-0bsd || ! test -d freestnd-c-hdrs || ! test -d cc-runtime || ! test -f src/ultra.h || ! test -d flanterm ); echo $$?),0)
 24          $(error Please run the ./get-deps script first)
 25      endif
 26  endif
 27  
 28  override CC_IS_CLANG := $(shell ! $(CC) --version 2>/dev/null | grep 'clang' >/dev/null 2>&1; echo $$?)
 29  
 30  override CFLAGS += \
 31      -Wall \
 32      -Wextra \
 33      -std=gnu11 \
 34      -nostdinc \
 35      -ffreestanding \
 36      -fno-stack-protector \
 37      -fno-stack-check \
 38      -fno-PIC \
 39      -ffunction-sections \
 40      -fdata-sections
 41  
 42  override CPPFLAGS := \
 43      -I src \
 44      -I src/arch/$(ARCH) \
 45      -I flanterm/src \
 46      -isystem freestnd-c-hdrs \
 47      -isystem freestnd-c-hdrs-0bsd \
 48      $(CPPFLAGS) \
 49      -DLIMINE_API_REVISION=3 \
 50      -MMD \
 51      -MP
 52  
 53  ifeq ($(ARCH),x86_64)
 54      override NASMFLAGS += \
 55          -Wall
 56  endif
 57  
 58  ifeq ($(ARCH),x86_64)
 59      ifeq ($(CC_IS_CLANG),1)
 60          override CC += \
 61              -target x86_64-unknown-none
 62      endif
 63      override CFLAGS += \
 64          -m64 \
 65          -march=x86-64 \
 66          -mno-80387 \
 67          -mno-mmx \
 68          -mno-sse \
 69          -mno-sse2 \
 70          -mno-red-zone \
 71          -mcmodel=kernel
 72      override LDFLAGS += \
 73          -Wl,-m,elf_x86_64
 74      override NASMFLAGS += \
 75          -f elf64
 76  endif
 77  
 78  ifeq ($(ARCH),i386)
 79      ifeq ($(CC_IS_CLANG),1)
 80          override CC += \
 81              -target i386-unknown-none
 82      endif
 83      override CFLAGS += \
 84          -m32 \
 85          -march=i386 \
 86          -mno-80387 \
 87          -mno-mmx \
 88          -mno-sse \
 89          -mno-sse2 \
 90          -mno-red-zone
 91      override LDFLAGS += \
 92          -Wl,-m,elf_i386
 93      override NASMFLAGS += \
 94          -f elf32
 95  endif
 96  
 97  override LDFLAGS += \
 98      -Wl,--build-id=none \
 99      -nostdlib \
100      -static \
101      -z max-page-size=0x1000 \
102      -Wl,--gc-sections \
103      -T linker-$(ARCH).ld
104  
105  override SRCFILES := $(shell find -L src -path 'src/arch' -prune -o -type f -print; find -L src/arch/$(ARCH) -type f 2>/dev/null; find -L cc-runtime/src flanterm -type f) | LC_ALL=C sort
106  override CFILES := $(filter %.c,$(SRCFILES))
107  override ASFILES := $(filter %.S,$(SRCFILES))
108  ifeq ($(ARCH),x86_64)
109  override NASMFILES := $(filter %.asm,$(SRCFILES))
110  endif
111  override OBJ := $(addprefix obj-$(ARCH)/,$(CFILES:.c=.c.o) $(ASFILES:.S=.S.o))
112  ifeq ($(ARCH),x86_64)
113  override OBJ += $(addprefix obj-$(ARCH)/,$(NASMFILES:.asm=.asm.o))
114  endif
115  override HEADER_DEPS := $(addprefix obj/,$(CFILES:.c=.c.d) $(ASFILES:.S=.S.d))
116  
117  .PHONY: all
118  all: bin-$(ARCH)/$(OUTPUT)
119  
120  -include $(HEADER_DEPS)
121  
122  bin-$(ARCH)/$(OUTPUT): GNUmakefile linker-$(ARCH).ld $(OBJ)
123  	mkdir -p "$$(dirname $@)"
124  	$(CC) $(CFLAGS) $(LDFLAGS) $(OBJ) -o $@
125  
126  obj-$(ARCH)/%.c.o: %.c GNUmakefile
127  	mkdir -p "$$(dirname $@)"
128  	$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@
129  
130  obj-$(ARCH)/%.S.o: %.S GNUmakefile
131  	mkdir -p "$$(dirname $@)"
132  	$(CC) $(CFLAGS) $(CPPFLAGS) -c $< -o $@
133  
134  obj-$(ARCH)/%.asm.o: %.asm GNUmakefile
135  	mkdir -p "$$(dirname $@)"
136  	nasm $(NASMFLAGS) $< -o $@
137  
138  .PHONY: clean
139  clean:
140  	rm -rf bin-$(ARCH) obj-$(ARCH)
141  
142  .PHONY: distclean
143  distclean: clean
144  	rm -rf freestnd-c-hdrs freestnd-c-hdrs-0bsd cc-runtime src/limine.h flanterm bin-* obj-* 
145  
146  .PHONY: install
147  install: all
148  	install -d "$(DESTDIR)$(PREFIX)/share/$(OUTPUT)"
149  	install -m 644 bin-$(ARCH)/$(OUTPUT) "$(DESTDIR)$(PREFIX)/share/$(OUTPUT)/$(OUTPUT)-$(ARCH)"
150  
151  .PHONY: uninstall
152  uninstall:
153  	rm -f "$(DESTDIR)$(PREFIX)/share/$(OUTPUT)/$(OUTPUT)-$(ARCH)"
154  	-rmdir "$(DESTDIR)$(PREFIX)/share/$(OUTPUT)"