Makefile.executable.mak 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. BUILD_DIR := bin
  2. OBJ_DIR := obj
  3. # NOTE: ASSEMBLY must be set on calling this makefile
  4. DEFINES := -DKIMPORT
  5. # Detect OS and architecture.
  6. ifeq ($(OS),Windows_NT)
  7. # WIN32
  8. BUILD_PLATFORM := windows
  9. EXTENSION := .exe
  10. COMPILER_FLAGS := -Wall -Werror -Wvla -Werror=vla -Wgnu-folding-constant -Wno-missing-braces -fdeclspec -Wstrict-prototypes
  11. INCLUDE_FLAGS := -I$(ASSEMBLY)\src $(ADDL_INC_FLAGS)
  12. LINKER_FLAGS := -L$(BUILD_DIR) $(ADDL_LINK_FLAGS)
  13. DEFINES += -D_CRT_SECURE_NO_WARNINGS
  14. # Make does not offer a recursive wildcard function, and Windows needs one, so here it is:
  15. rwildcard=$(wildcard $1$2) $(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2))
  16. DIR := $(subst /,\,${CURDIR})
  17. # .c files
  18. SRC_FILES := $(call rwildcard,$(ASSEMBLY)/,*.c)
  19. # directories with .h files
  20. DIRECTORIES := \$(ASSEMBLY)\src $(subst $(DIR),,$(shell dir $(ASSEMBLY)\src /S /AD /B | findstr /i src))
  21. OBJ_FILES := $(SRC_FILES:%=$(OBJ_DIR)/%.o)
  22. ifeq ($(PROCESSOR_ARCHITEW6432),AMD64)
  23. # AMD64
  24. else
  25. ifeq ($(PROCESSOR_ARCHITECTURE),AMD64)
  26. # AMD64
  27. endif
  28. ifeq ($(PROCESSOR_ARCHITECTURE),x86)
  29. # IA32
  30. endif
  31. endif
  32. else
  33. UNAME_S := $(shell uname -s)
  34. ifeq ($(UNAME_S),Linux)
  35. # LINUX
  36. BUILD_PLATFORM := linux
  37. EXTENSION :=
  38. COMPILER_FLAGS := -Wall -Werror -Wvla -Werror=vla -Wgnu-folding-constant -Wno-missing-braces -fdeclspec -fPIC
  39. INCLUDE_FLAGS := -I./$(ASSEMBLY)/src $(ADDL_INC_FLAGS)
  40. LINKER_FLAGS := -L./$(BUILD_DIR) $(ADDL_LINK_FLAGS) -Wl,-rpath,.
  41. # .c files
  42. SRC_FILES := $(shell find $(ASSEMBLY) -name *.c)
  43. # directories with .h files
  44. DIRECTORIES := $(shell find $(ASSEMBLY) -type d)
  45. OBJ_FILES := $(SRC_FILES:%=$(OBJ_DIR)/%.o)
  46. endif
  47. ifeq ($(UNAME_S),Darwin)
  48. # OSX
  49. BUILD_PLATFORM := macos
  50. EXTENSION :=
  51. COMPILER_FLAGS := -Wall -Werror -Wvla -Werror=vla -Wgnu-folding-constant -Wno-missing-braces -fdeclspec -fPIC
  52. INCLUDE_FLAGS := -I./$(ASSEMBLY)/src $(ADDL_INC_FLAGS)
  53. LINKER_FLAGS := -L./$(BUILD_DIR) $(ADDL_LINK_FLAGS) -Wl,-rpath,.
  54. # .c files
  55. SRC_FILES := $(shell find $(ASSEMBLY) -name *.c)
  56. # directories with .h files
  57. DIRECTORIES := $(shell find $(ASSEMBLY) -type d)
  58. OBJ_FILES := $(SRC_FILES:%=$(OBJ_DIR)/%.o)
  59. endif
  60. UNAME_P := $(shell uname -p)
  61. ifeq ($(UNAME_P),x86_64)
  62. # AMD64
  63. endif
  64. ifneq ($(filter %86,$(UNAME_P)),)
  65. # IA32
  66. endif
  67. ifneq ($(filter arm%,$(UNAME_P)),)
  68. # ARM
  69. endif
  70. endif
  71. # Defaults to debug unless release is specified.
  72. ifeq ($(TARGET),release)
  73. # release
  74. else
  75. # debug
  76. DEFINES += -D_DEBUG
  77. COMPILER_FLAGS += -g -MD
  78. LINKER_FLAGS += -g
  79. endif
  80. all: scaffold compile link gen_compile_flags
  81. .PHONY: scaffold
  82. scaffold: # create build directory
  83. ifeq ($(BUILD_PLATFORM),windows)
  84. -@setlocal enableextensions enabledelayedexpansion && mkdir $(addprefix $(OBJ_DIR), $(DIRECTORIES)) 2>NUL || cd .
  85. -@setlocal enableextensions enabledelayedexpansion && mkdir $(BUILD_DIR) 2>NUL || cd .
  86. else
  87. @mkdir -p $(BUILD_DIR)
  88. @mkdir -p $(addprefix $(OBJ_DIR)/,$(DIRECTORIES))
  89. endif
  90. .PHONY: link
  91. link: scaffold $(OBJ_FILES) # link
  92. @echo Linking "$(ASSEMBLY)"...
  93. ifeq ($(BUILD_PLATFORM),windows)
  94. @clang $(OBJ_FILES) -o $(BUILD_DIR)\$(ASSEMBLY)$(EXTENSION) $(LINKER_FLAGS)
  95. else
  96. @clang $(OBJ_FILES) -o $(BUILD_DIR)/$(ASSEMBLY)$(EXTENSION) $(LINKER_FLAGS)
  97. endif
  98. .PHONY: compile
  99. compile:
  100. @echo --- Performing "$(ASSEMBLY)" $(TARGET) build ---
  101. -include $(OBJ_FILES:.o=.d)
  102. .PHONY: clean
  103. clean: # clean build directory
  104. @echo --- Cleaning "$(ASSEMBLY)" ---
  105. ifeq ($(BUILD_PLATFORM),windows)
  106. @if exist $(BUILD_DIR)\$(ASSEMBLY)$(EXTENSION) del $(BUILD_DIR)\$(ASSEMBLY)$(EXTENSION)
  107. # Windows builds include a lot of files... get them all.
  108. @if exist $(BUILD_DIR)\$(ASSEMBLY).* del $(BUILD_DIR)\$(ASSEMBLY).*
  109. @if exist $(OBJ_DIR)\$(ASSEMBLY) rmdir /s /q $(OBJ_DIR)\$(ASSEMBLY)
  110. else
  111. @rm -rf $(BUILD_DIR)/$(ASSEMBLY)$(EXTENSION)
  112. @rm -rf $(OBJ_DIR)/$(ASSEMBLY)
  113. endif
  114. # compile .c to .o object for windows, linux and mac
  115. $(OBJ_DIR)/%.c.o: %.c
  116. @echo $<...
  117. @clang $< $(COMPILER_FLAGS) -c -o $@ $(DEFINES) $(INCLUDE_FLAGS)
  118. -include $(OBJ_FILES:.o=.d)
  119. .PHONY: gen_compile_flags
  120. gen_compile_flags:
  121. ifeq ($(BUILD_PLATFORM),windows)
  122. $(shell powershell \"$(INCLUDE_FLAGS) $(DEFINES)\".replace('-I', '-I..\').replace(' ', \"`n\").replace('-I..\C:', '-IC:') > $(ASSEMBLY)/compile_flags.txt)
  123. else
  124. @echo $(INCLUDE_FLAGS) $(DEFINES) | tr " " "\n" | sed "s/\-I\.\//\-I\.\.\//g" > $(ASSEMBLY)/compile_flags.txt
  125. endif