Makefile 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. # Kohi Utils makefile
  2. # All compiler flags/rules used across the board.
  3. CFLAGS =-std=gnu11 -Wall -Wextra -Werror -Wno-error=deprecated-declarations -Wno-error=unused-function
  4. CFLAGS +=-Wvla -Werror=vla -Wgnu-folding-constant -Wno-missing-braces -Wstrict-prototypes -Wno-unused-parameter
  5. CFLAGS +=-Wno-missing-field-initializers -Wno-tautological-compare
  6. # NOTE: -fvisibility=hidden hides all symbols by default, and only those that explicitly say otherwise are exported (i.e. via KAPI).
  7. CFLAGS +=-fvisibility=hidden
  8. # Base linker flags
  9. LDFLAGS = -Lbin -Llib
  10. # Base include flags
  11. INCLUDE_FLAGS = -Isrc
  12. DEFINES =-DKIMPORT
  13. VG_ASSEMBLY_NAME =versiongen
  14. CFG_ASSEMBLY_NAME =cfgen
  15. KTIME_ASSEMBLY_NAME=ktime
  16. VG_OUTPUT_NAME =
  17. CFG_OUTPUT_NAME =
  18. KTIME_OUTPUT_NAME =
  19. UNAME_S :=
  20. ifneq ($(OS),Windows_NT)
  21. UNAME_S = $(shell uname -s)
  22. endif
  23. ifeq ($(OS),Windows_NT)
  24. PLATFORM := win32
  25. else ifeq ($(UNAME_S),Linux)
  26. PLATFORM := linux
  27. else ifeq ($(UNAME_S),Darwin)
  28. PLATFORM := macos
  29. else
  30. $(error Unsupported platform)
  31. endif
  32. # =========================================================
  33. # BEGIN TARGET RECIPES
  34. # =========================================================
  35. .PHONY: all-release all-debug flags-debug flags-release
  36. .PHONY: genversion genversion-win32 genversion-linux genversion-macos
  37. .PHONY: scaffold scaffold-win32 scaffold-linux scaffold-macos
  38. .PHONY: link link-win32 link-linux link-macos
  39. all-release: scaffold flags-release compile link
  40. all-debug: scaffold flags-debug compile link
  41. flags-debug: DEFINES += -D_DEBUG
  42. flags-debug: CFLAGS += -g -MD -O0 -fno-omit-frame-pointer
  43. flags-debug: LDFLAGS += -g
  44. flags-debug: link compile
  45. flags-release: DEFINES += -DKRELEASE
  46. flags-release: CFLAGS += -MD -O2
  47. flags-release: LDFLAGS +=
  48. flags-release: link compile
  49. scaffold: scaffold-$(PLATFORM)
  50. .NOTPARALLEL: scaffold
  51. scaffold-win32:
  52. @if not exist obj mkdir obj
  53. @if not exist bin mkdir bin
  54. scaffold-linux scaffold-macos:
  55. @mkdir -p bin
  56. @mkdir -p obj
  57. .PHONY: clean
  58. clean: clean-$(PLATFORM)
  59. clean-win32:
  60. if exist bin del /s /q bin\*.*
  61. if exist obj del /s /q obj\*.*
  62. clean-linux clean-macos:
  63. @rm -rf bin/*
  64. @rm -rf obj/*
  65. link: link-$(PLATFORM)
  66. link-win32: LDFLAGS += -fdeclspec -Wno-cast-function-type-mismatch -luser32 -lgdi32 -lwinmm -Xlinker /INCREMENTAL
  67. link-win32: DEFINES += -D_CRT_SECURE_NO_WARNINGS -DUNICODE
  68. link-win32: VG_OUTPUT_NAME = bin\$(VG_ASSEMBLY_NAME).exe
  69. link-win32: CFG_OUTPUT_NAME = bin\$(CFG_ASSEMBLY_NAME).exe
  70. link-win32: KTIME_OUTPUT_NAME = bin\$(KTIME_ASSEMBLY_NAME).exe
  71. # NOTE: --no-undefined and --no-allow-shlib-undefined ensure that symbols linking against are resolved.
  72. # These are linux-specific, as the default behaviour is the opposite of this, allowing code to compile
  73. # here that would not on other platforms from not being exported (i.e. Windows)
  74. # Discovered the solution here for this: https://github.com/ziglang/zig/issues/8180
  75. link-linux: CFLAGS += -Wno-cast-function-type-mismatch -fPIC
  76. link-linux: LDFLAGS += -lxcb -lX11 -lX11-xcb -lxkbcommon -lxcb-xkb -lm -ldl -L/usr/X11R6/lib -Wl,--no-undefined,--no-allow-shlib-undefined,-rpath='$$ORIGIN'
  77. link-linux: VG_OUTPUT_NAME = bin/$(VG_ASSEMBLY_NAME)
  78. link-linux: CFG_OUTPUT_NAME = bin/$(CFG_ASSEMBLY_NAME)
  79. link-linux: KTIME_OUTPUT_NAME = bin/$(KTIME_ASSEMBLY_NAME)
  80. link-macos: LDFLAGS += -lobjc -framework AppKit -framework QuartzCore -framework DiskArbitration -framework CoreFoundation
  81. link-macos: VG_OUTPUT_NAME = bin/$(VG_ASSEMBLY_NAME)
  82. link-macos: CFG_OUTPUT_NAME = bin/$(CFG_ASSEMBLY_NAME)
  83. link-macos: KTIME_OUTPUT_NAME = bin/$(KTIME_ASSEMBLY_NAME)
  84. link-win32 link-linux link-macos: link-common-vg link-common-cfg
  85. link-win32: link-ktime-win32
  86. link-common-vg: obj/versiongen.c.o
  87. clang obj/versiongen.c.o -o $(VG_OUTPUT_NAME) $(LDFLAGS)
  88. link-common-cfg: obj/cfgen.c.o
  89. clang obj/cfgen.c.o -o $(CFG_OUTPUT_NAME) $(LDFLAGS)
  90. link-ktime-win32: obj/ktime.c.o
  91. clang obj/ktime.c.o -o $(KTIME_OUTPUT_NAME) $(LDFLAGS)
  92. obj/versiongen.c.o obj/cfgen.c.o: compile
  93. .PHONY: compile
  94. compile: compile-$(PLATFORM)
  95. compile-macos compile-linux: compile-common
  96. compile-win32: compile-common
  97. clang src/ktime.c $(CFLAGS) -c -o obj/ktime.c.o $(DEFINES) $(INCLUDE_FLAGS)
  98. compile-common:
  99. clang src/versiongen.c $(CFLAGS) -c -o obj/versiongen.c.o $(DEFINES) $(INCLUDE_FLAGS)
  100. clang src/cfgen.c $(CFLAGS) -c -o obj/cfgen.c.o $(DEFINES) $(INCLUDE_FLAGS)