Makefile 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. # Testbed.Kapp makefile
  2. ASSEMBLY_NAME=testbed.kapp
  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../kohi.runtime/bin -lkohi.core -lkohi.runtime
  11. LDFLAGS += -L../kohi.plugin.utils/bin -L../kohi.plugin.ui.kui/bin -L../testbed.klib/bin -lkohi.plugin.ui.kui -lkohi.plugin.utils -ltestbed.klib
  12. # Base include flags
  13. INCLUDE_FLAGS = -Isrc -I../kohi.core/src -I../kohi.runtime/src
  14. INCLUDE_FLAGS += -I../testbed.klib/src
  15. DEFINES =-DKEXPORT
  16. OUTPUT_NAME =
  17. UNAME_S :=
  18. ifneq ($(OS),Windows_NT)
  19. UNAME_S = $(shell uname -s)
  20. endif
  21. ifeq ($(OS),Windows_NT)
  22. PLATFORM := win32
  23. # Make does not offer a recursive wildcard function, and Windows needs one, so here it is:
  24. rwildcard=$(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2))
  25. DIR := $(subst /,\,${CURDIR})
  26. SRC_FILES := $(call rwildcard,src,*.c)
  27. DIRECTORIES := \src $(subst $(DIR),,$(shell dir src /S /AD /B | findstr /i src))
  28. OBJ_FILES := $(SRC_FILES:%=obj/%.o)
  29. else ifeq ($(UNAME_S),Linux)
  30. PLATFORM := linux
  31. SRC_FILES := $(shell find src -name "*.c")
  32. DIRECTORIES := $(shell find src -type d)
  33. OBJ_FILES := $(SRC_FILES:%=obj/%.o)
  34. else ifeq ($(UNAME_S),Darwin)
  35. PLATFORM := macos
  36. SRC_FILES := $(shell find src -type f \( -name "*.c" \))
  37. DIRECTORIES := $(shell find src -type d)
  38. OBJ_FILES := $(SRC_FILES:%=obj/%.o)
  39. else
  40. $(error Unsupported platform)
  41. endif
  42. # =========================================================
  43. # BEGIN TARGET RECIPES
  44. # =========================================================
  45. .PHONY: all-release all-debug flags-debug flags-release
  46. .PHONY: genversion genversion-win32 genversion-linux genversion-macos
  47. .PHONY: scaffold scaffold-win32 scaffold-linux scaffold-macos
  48. .PHONY: link link-win32 link-linux link-macos
  49. all-release: scaffold genversion gen_compile_flags-release flags-release compile link
  50. all-debug: scaffold genversion gen_compile_flags-debug flags-debug compile link
  51. flags-debug: DEFINES += -D_DEBUG
  52. flags-debug: CFLAGS += -g -MD -O0 -fno-omit-frame-pointer
  53. flags-debug: LDFLAGS += -g
  54. flags-debug: link compile
  55. flags-release: DEFINES += -DKRELEASE
  56. flags-release: CFLAGS += -MD -O2
  57. flags-release: LDFLAGS +=
  58. flags-release: link compile
  59. scaffold: scaffold-$(PLATFORM)
  60. .NOTPARALLEL: scaffold
  61. scaffold-win32:
  62. -@mkdir $(addprefix obj\\, $(DIRECTORIES)) 2>nul
  63. @if not exist bin mkdir bin
  64. scaffold-linux scaffold-macos:
  65. @mkdir -p bin
  66. @mkdir -p $(addprefix obj/,$(DIRECTORIES))
  67. genversion: genversion-$(PLATFORM)
  68. genversion-win32:
  69. @..\misc\versiongen.exe version.txt -outfile=src\$(ASSEMBLY_NAME)_version.h
  70. genversion-linux genversion-macos:
  71. @../misc/versiongen version.txt -outfile=src/$(ASSEMBLY_NAME)_version.h
  72. .PHONY: clean
  73. clean: clean-$(PLATFORM)
  74. clean-win32:
  75. if exist bin del /s /q bin\*.*
  76. if exist obj del /s /q obj\*.*
  77. clean-linux clean-macos:
  78. @rm -rf bin/*
  79. @rm -rf obj/*
  80. link: link-$(PLATFORM)
  81. link-win32: LDFLAGS += -fdeclspec -Wno-cast-function-type-mismatch -Xlinker /INCREMENTAL
  82. link-win32: DEFINES += -D_CRT_SECURE_NO_WARNINGS -DUNICODE
  83. link-win32: OUTPUT_NAME = bin\$(ASSEMBLY_NAME).exe
  84. link-linux: CFLAGS += -Wno-cast-function-type-mismatch -fPIC
  85. link-linux: LDFLAGS += -Wl,--no-undefined,--no-allow-shlib-undefined,-rpath='$$ORIGIN'
  86. link-linux: OUTPUT_NAME = bin/$(ASSEMBLY_NAME)
  87. link-macos: LDFLAGS += -Wl,-rpath,.
  88. link-macos: OUTPUT_NAME = bin/$(ASSEMBLY_NAME)
  89. link-win32 link-linux link-macos: link-common
  90. link-common: $(OBJ_FILES)
  91. @clang $(OBJ_FILES) -o $(OUTPUT_NAME) $(LDFLAGS)
  92. .PHONY: compile
  93. compile:
  94. -include $(OBJ_FILES:.o=.d)
  95. # compile .c to .o object for windows, linux and mac
  96. obj/%.c.o: %.c
  97. @echo $<...
  98. @clang $< $(CFLAGS) -c -o $@ $(DEFINES) $(INCLUDE_FLAGS)
  99. -include $(OBJ_FILES:.o=.d)
  100. .PHONY: gen_compile_flags-debug
  101. gen_compile_flags-debug: DEFINES += -D_DEBUG
  102. gen_compile_flags-debug: gen_compile_flags
  103. gen_compile_flags-release: gen_compile_flags
  104. .PHONY: gen_compile_flags
  105. gen_compile_flags:
  106. ifeq ($(BUILD_PLATFORM),windows)
  107. @..\misc\cfgen -outfile=compile_flags.txt $(INCLUDE_FLAGS) $(DEFINES) -ferror-limit=0
  108. else
  109. @../misc/cfgen -outfile=compile_flags.txt $(INCLUDE_FLAGS) $(DEFINES) -ferror-limit=0
  110. endif