Makefile 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. # Kohi.Runtime makefile
  2. ASSEMBLY_NAME=kohi.runtime
  3. # All compiler flags/rules used across the board.
  4. CFLAGS =-std=gnu11 -Wall -Wextra -Werror -Wno-error=deprecated-declarations -Wno-error=unused-function
  5. CFLAGS +=-Wvla -Werror=vla -Wgnu-folding-constant -Wno-missing-braces -Wstrict-prototypes -Wno-unused-parameter
  6. CFLAGS +=-Wno-missing-field-initializers -Wno-tautological-compare
  7. # NOTE: -fvisibility=hidden hides all symbols by default, and only those that explicitly say otherwise are exported (i.e. via KAPI).
  8. CFLAGS +=-fvisibility=hidden
  9. # Base linker flags
  10. LDFLAGS = -Lbin -Llib -L../kohi.core/bin -L. -lkohi.core
  11. # Base include flags
  12. INCLUDE_FLAGS = -Isrc -I../kohi.core/src
  13. DEFINES =-DKEXPORT
  14. OUTPUT_NAME =
  15. UNAME_S :=
  16. ifneq ($(OS),Windows_NT)
  17. UNAME_S = $(shell uname -s)
  18. endif
  19. ifeq ($(OS),Windows_NT)
  20. PLATFORM := win32
  21. # Make does not offer a recursive wildcard function, and Windows needs one, so here it is:
  22. rwildcard=$(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2))
  23. DIR := $(subst /,\,${CURDIR})
  24. SRC_FILES := $(call rwildcard,src,*.c)
  25. DIRECTORIES := \src $(subst $(DIR),,$(shell dir src /S /AD /B | findstr /i src))
  26. OBJ_FILES := $(SRC_FILES:%=obj/%.o)
  27. else ifeq ($(UNAME_S),Linux)
  28. PLATFORM := linux
  29. SRC_FILES := $(shell find src -name "*.c")
  30. DIRECTORIES := $(shell find src -type d)
  31. OBJ_FILES := $(SRC_FILES:%=obj/%.o)
  32. else ifeq ($(UNAME_S),Darwin)
  33. PLATFORM := macos
  34. SRC_FILES := $(shell find src -type f \( -name "*.c" \))
  35. DIRECTORIES := $(shell find src -type d)
  36. OBJ_FILES := $(SRC_FILES:%=obj/%.o)
  37. else
  38. $(error Unsupported platform)
  39. endif
  40. # =========================================================
  41. # BEGIN TARGET RECIPES
  42. # =========================================================
  43. .PHONY: all-release all-debug flags-debug flags-release
  44. .PHONY: genversion genversion-win32 genversion-linux genversion-macos
  45. .PHONY: scaffold scaffold-win32 scaffold-linux scaffold-macos
  46. .PHONY: link link-win32 link-linux link-macos
  47. all-release: scaffold genversion gen_compile_flags-release flags-release compile link
  48. all-debug: scaffold genversion gen_compile_flags-debug flags-debug compile link
  49. flags-debug: DEFINES += -D_DEBUG
  50. flags-debug: CFLAGS += -g -MD -O0 -fno-omit-frame-pointer
  51. flags-debug: LDFLAGS += -g
  52. flags-debug: link compile
  53. flags-release: DEFINES += -DKRELEASE
  54. flags-release: CFLAGS += -MD -O2
  55. flags-release: LDFLAGS +=
  56. scaffold: scaffold-$(PLATFORM)
  57. .NOTPARALLEL: scaffold
  58. scaffold-win32:
  59. -@mkdir $(addprefix obj\\, $(DIRECTORIES)) 2>nul
  60. @if not exist bin mkdir bin
  61. scaffold-linux scaffold-macos:
  62. @mkdir -p bin
  63. @mkdir -p $(addprefix obj/,$(DIRECTORIES))
  64. genversion: genversion-$(PLATFORM)
  65. genversion-win32:
  66. @..\misc\versiongen.exe version.txt -outfile=src\$(ASSEMBLY_NAME)_version.h
  67. genversion-linux genversion-macos:
  68. @../misc/versiongen version.txt -outfile=src/$(ASSEMBLY_NAME)_version.h
  69. .PHONY: clean
  70. clean: clean-$(PLATFORM)
  71. clean-win32:
  72. if exist bin del /s /q bin\*.*
  73. if exist obj del /s /q obj\*.*
  74. clean-linux clean-macos:
  75. @rm -rf bin/*
  76. @rm -rf obj/*
  77. link: link-$(PLATFORM)
  78. link-win32: LDFLAGS += -fdeclspec -Wno-cast-function-type-mismatch -Xlinker /INCREMENTAL
  79. link-win32: DEFINES += -D_CRT_SECURE_NO_WARNINGS -DUNICODE
  80. link-win32: OUTPUT_NAME = bin\$(ASSEMBLY_NAME).dll
  81. # NOTE: --no-undefined and --no-allow-shlib-undefined ensure that symbols linking against are resolved.
  82. # These are linux-specific, as the default behaviour is the opposite of this, allowing code to compile
  83. # here that would not on other platforms from not being exported (i.e. Windows)
  84. # Discovered the solution here for this: https://github.com/ziglang/zig/issues/8180
  85. link-linux: CFLAGS += -Wno-cast-function-type-mismatch -fPIC
  86. link-linux: LDFLAGS += -lm
  87. link-linux: OUTPUT_NAME = bin/lib$(ASSEMBLY_NAME).so
  88. link-macos: LDFLAGS += -dynamiclib -install_name @rpath/lib$(ASSEMBLY_NAME).dylib
  89. link-macos: OUTPUT_NAME = bin/lib$(ASSEMBLY_NAME).dylib
  90. link-win32 link-linux link-macos: link-common
  91. link-common: $(OBJ_FILES)
  92. @clang $(OBJ_FILES) -o $(OUTPUT_NAME) -shared $(LDFLAGS)
  93. .PHONY: compile
  94. compile:
  95. -include $(OBJ_FILES:.o=.d)
  96. # compile .c to .o object for windows, linux and mac
  97. obj/%.c.o: %.c
  98. @echo $<...
  99. @clang $< $(CFLAGS) -c -o $@ $(DEFINES) $(INCLUDE_FLAGS)
  100. -include $(OBJ_FILES:.o=.d)
  101. .PHONY: gen_compile_flags-debug
  102. gen_compile_flags-debug: DEFINES += -D_DEBUG
  103. gen_compile_flags-debug: gen_compile_flags
  104. gen_compile_flags-release: gen_compile_flags
  105. .PHONY: gen_compile_flags
  106. gen_compile_flags:
  107. ifeq ($(BUILD_PLATFORM),windows)
  108. @..\misc\cfgen -outfile=compile_flags.txt $(INCLUDE_FLAGS) $(DEFINES) -ferror-limit=0
  109. else
  110. @../misc/cfgen -outfile=compile_flags.txt $(INCLUDE_FLAGS) $(DEFINES) -ferror-limit=0
  111. endif