Makefile 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. ifeq ($(OS),Windows_NT)
  2. SHELL := cmd.exe
  3. endif
  4. PROJECT_PATH := .
  5. # Set default toolchain if MLIBC_TOOLCHAIN is not set
  6. ifeq ($(MLIBC_TOOLCHAIN),)
  7. MLIBC_TOOLCHAIN := $(PROJECT_PATH)/toolchain/arm-linux-eabi_for_x86_64-pc-linux-gnu/bin/arm-linux-eabi-
  8. endif
  9. CC := $(MLIBC_TOOLCHAIN)gcc
  10. AR := $(MLIBC_TOOLCHAIN)ar
  11. # Select architecture (you can set this manually or through environment variables)
  12. ARCH ?= arm
  13. # Configuration for arch
  14. ifeq ($(ARCH), arm)
  15. ARCH_FLAGS :=
  16. DEFINE_FLAGS :=
  17. endif
  18. ifeq ($(ARCH), aarch64)
  19. ARCH_FLAGS := -mstrict-align
  20. DEFINE_FLAGS :=
  21. endif
  22. ifeq ($(ARCH), riscv32)
  23. ARCH_FLAGS := -mcmodel=medany -march=rv32imac
  24. DEFINE_FLAGS :=
  25. endif
  26. ifeq ($(ARCH), riscv64)
  27. ARCH_FLAGS := -mcmodel=medany
  28. DEFINE_FLAGS :=
  29. endif
  30. # flags
  31. CFLAGS := $(DEFINE_FLAGS) $(ARCH_FLAGS) -nostdlib -ffreestanding -nostdinc -Wl,-Map=cc.map
  32. INCLUDES := -I $(PROJECT_PATH)/include
  33. # Source files
  34. SRC_FILES := $(wildcard $(PROJECT_PATH)/src/dummy/*.c) \
  35. $(wildcard $(PROJECT_PATH)/src/misc/*.c) \
  36. $(wildcard $(PROJECT_PATH)/src/stdio/*.c) \
  37. $(wildcard $(PROJECT_PATH)/src/stdlib/*.c) \
  38. $(wildcard $(PROJECT_PATH)/src/time/*.c)
  39. CRT_FILES := $(wildcard $(PROJECT_PATH)/crt/$(ARCH)/*.c) \
  40. $(wildcard $(PROJECT_PATH)/crt/$(ARCH)/*.s)
  41. # Target settings
  42. TARGET := libmlibc.a
  43. TARGET_DIR_ARCH := $(PROJECT_PATH)/build/$(ARCH)
  44. LIB_PATH := $(PROJECT_PATH)/mlibc/lib
  45. # Object files directory
  46. OBJ_DIR := $(TARGET_DIR_ARCH)/obj
  47. CRTOBJ_DIR := $(TARGET_DIR_ARCH)/crtobj
  48. OBJ_FILES := $(patsubst %.c,$(OBJ_DIR)/%.o,$(notdir $(SRC_FILES)))
  49. CRTOBJ_FILE := $(patsubst %.c,$(CRTOBJ_DIR)/%.o,$(notdir $(CRT_FILES)))
  50. CRTOBJ_FILES := $(patsubst %.S,$(CRTOBJ_DIR)/%.o,$(CRTOBJ_FILE))
  51. # Include QEMU hello world build configuration
  52. include $(PROJECT_PATH)/mkconfigs/qemu/qemu-hello.mk
  53. # Build rules
  54. .PHONY: all
  55. all : mlibc crt
  56. .PHONY: mlibc
  57. mlibc: creat_mdir $(TARGET_DIR_ARCH)/$(TARGET)
  58. # Compile each .c file into .o in the obj directory
  59. $(OBJ_DIR)/%.o: $(PROJECT_PATH)/src/*/%.c
  60. $(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
  61. $(TARGET_DIR_ARCH)/$(TARGET): $(OBJ_FILES)
  62. $(AR) rcs $@ $(OBJ_FILES)
  63. .PHONY: creat_mdir
  64. creat_mdir:
  65. ifeq ($(OS),Windows_NT)
  66. if not exist $(subst /,\,$(OBJ_DIR)) @mkdir $(subst /,\,$(OBJ_DIR))
  67. if not exist $(subst /,\,$(CRTOBJ_DIR)) @mkdir $(subst /,\,$(CRTOBJ_DIR))
  68. else
  69. @mkdir -p $(OBJ_DIR)
  70. @mkdir -p $(CRTOBJ_DIR)
  71. endif
  72. .PHONY: crt
  73. crt: creat_cdir $(CRTOBJ_FILES)
  74. $(CRTOBJ_DIR)/%.o: $(PROJECT_PATH)/crt/$(ARCH)/%.c
  75. $(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
  76. $(CRTOBJ_DIR)/%.o: $(PROJECT_PATH)/crt/$(ARCH)/%.s
  77. $(CC) $(CFLAGS) $(INCLUDES) -c $< -o $@
  78. .PHONY: creat_cdir
  79. creat_cdir:
  80. ifeq ($(OS),Windows_NT)
  81. if not exist $(subst /,\,$(CRTOBJ_DIR)) @mkdir $(subst /,\,$(CRTOBJ_DIR))
  82. else
  83. @mkdir -p $(CRTOBJ_DIR)
  84. endif
  85. .PHONY: clean
  86. clean:
  87. ifeq ($(OS),Windows_NT)
  88. @rmdir /s/q $(subst /,\,$(PROJECT_PATH))\build
  89. else
  90. @rm -rf $(PROJECT_PATH)/build
  91. @echo ${CRTOBJ_FILES}
  92. @echo ${CRTOBJ_FILE}
  93. endif