/ 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)"