Makefile 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. export PAL_DIR = $(CURDIR)
  2. export RUNTIME_DIR = $(CURDIR)/../../Runtime
  3. include Makefile.Host
  4. # Customizable PAL Targets
  5. # (specify in Makefile.am in host-specific directories)
  6. # For concurrent builds, all PAL targets must be in host-specific directories
  7. pal_loader =
  8. pal_sec =
  9. pal_lib =
  10. pal_lib_deps =
  11. pal_lib_post =
  12. pal_static =
  13. pal_gdb =
  14. include host/$(PAL_HOST)/Makefile.am
  15. HOST_DIR = host/$(PAL_HOST)
  16. LIB_DIR = $(HOST_DIR)/.lib
  17. OBJ_DIR = $(HOST_DIR)/.obj
  18. CFLAGS += -I. -I../include -I$(HOST_DIR) -I../lib
  19. ifeq ($(PROFILING),1)
  20. CFLAGS += -DPROFILING=1
  21. endif
  22. # Build Targets:
  23. # (1) Host-specific targets are in "host/{Host Name}".
  24. # (2) Generic targets are in "host/{Host Name}/.obj".
  25. # (3) API library targets are in "host/{Host Name}/.lib".
  26. files_to_build = $(pal_lib) $(pal_lib_post) $(pal_static) \
  27. $(pal_loader) $(pal_sec)
  28. defs = -DIN_PAL -DHOST_TYPE="$(PAL_HOST)" -D$(PAL_HOST_MACRO) -DPAL_DIR=$(PAL_DIR) \
  29. -DRUNTIME_DIR=$(RUNTIME_DIR)
  30. objs = $(addprefix db_,streams memory threading mutex events process \
  31. object main misc ipc exception rtld) slab printf
  32. graphene_lib = $(LIB_DIR)/graphene-lib.a
  33. host_lib = $(HOST_DIR)/libpal-$(PAL_HOST).a
  34. headers = $(wildcard *.h) $(wildcard ../lib/*.h) $(HOST_DIR)/pal_host.h
  35. ifeq ($(findstring x86_64,$(SYS))$(findstring linux,$(SYS)),x86_64linux)
  36. files_to_build += user_start.o user_shared_start.o
  37. endif
  38. ifeq ($(DEBUG),1)
  39. CC += -gdwarf-2 -g3
  40. CFLAGS += -DDEBUG
  41. endif
  42. export DEBUG
  43. # Install Targets (all in RUNTIME_DIR):
  44. # pal-{Host Name}: loader for PAL (as an executable)
  45. # libpal-{Host Name}.so: dynamic-linking library
  46. # pal_sec-{Host Name}: secure loader for PAL (as an executable)
  47. # pal_gdb-{Host Name}: debugger for PAL (as an executable)
  48. runtime_loader = $(RUNTIME_DIR)/pal-$(PAL_HOST)
  49. ifneq ($(pal_lib),)
  50. runtime_lib += $(RUNTIME_DIR)/libpal-$(PAL_HOST)$(suffix $(pal_lib))
  51. endif
  52. ifneq ($(pal_sec),)
  53. runtime_sec += $(RUNTIME_DIR)/pal_sec-$(PAL_HOST)
  54. endif
  55. ifneq ($(pal_gdb),)
  56. runtime_gdb += $(RUNTIME_DIR)/pal_gdb-$(PAL_HOST)
  57. endif
  58. files_to_install = $(runtime_loader) $(runtime_lib) $(runtime_sec) $(runtime_gdb)
  59. ###########################
  60. ## Generic Build Rules ##
  61. ###########################
  62. .PHONY: all
  63. all: $(files_to_build) $(files_to_install)
  64. $(LIB_DIR)/host_endian.h: $(HOST_DIR)/host_endian.h
  65. @mkdir -p $(LIB_DIR)
  66. cp -f $< $@
  67. .PHONY: $(host_lib) $(graphene_lib) $(pal_lib) $(pal_sec)
  68. $(graphene_lib): $(LIB_DIR)/host_endian.h
  69. $(MAKE) -C ../lib target=$(abspath $(LIB_DIR))/
  70. $(host_lib): $(graphene_lib)
  71. @[ ! -d host/$(PAL_HOST) ] || $(MAKE) -C host/$(PAL_HOST)
  72. $(pal_loader) $(pal_sec): $(host_lib)
  73. $(runtime_loader): $(pal_loader)
  74. cp -f $< $@
  75. ifneq ($(pal_lib),)
  76. $(pal_lib): $(addprefix $(OBJ_DIR)/,$(addsuffix .o,$(objs))) \
  77. $(host_lib) $(graphene_lib) $(pal_lib_deps)
  78. @echo [ $@ ]
  79. $(LD) $(LDFLAGS) -o $@ $(filter-out %.map %.lds,$^) $(LDFLAGS-suffix)
  80. $(runtime_lib): $(pal_lib)
  81. cp -f $< $@
  82. endif
  83. ifneq ($(pal_sec),)
  84. $(pal_sec): $(graphene_lib)
  85. @[ ! -d security/$(PAL_HOST) ] || $(MAKE) -C security/$(PAL_HOST)
  86. $(runtime_sec): $(pal_sec)
  87. cp -f $< $@
  88. endif
  89. ifneq ($(pal_gdb),)
  90. $(runtime_gdb): $(pal_gdb)
  91. ifeq ($(abspath $(pal_gdb)),$(pal_gdb))
  92. ln -sf $< $@
  93. else
  94. ln -sf ../Pal/src/$< $@
  95. endif
  96. endif
  97. ifneq ($(pal_lib_post),)
  98. $(pal_lib_post): $(pal_lib)
  99. @$(MAKE) -C $(HOST_DIR) $@
  100. endif
  101. $(pal_static): $(addprefix $(OBJ_DIR)/,$(addsuffix .o,$(objs))) \
  102. $(host_lib) $(graphene_lib)
  103. @echo [ $@ ]
  104. @$(AR) $(ARFLAGS) $@ $^ $(ARFLAGS-suffix)
  105. $(OBJ_DIR)/%.asm: %.c $(headers)
  106. @mkdir -p $(OBJ_DIR)
  107. @echo [ $@ ]
  108. @$(CC) $(CFLAGS) $(defs) -c $< -o $<.o
  109. @objdump -S $<.o > $@
  110. @rm $<.o
  111. user_start.o: user_start.S
  112. @echo [ $@ ]
  113. @$(CC) -c $< -o $@
  114. user_shared_start.o: user_start.S
  115. @echo [ $@ ]
  116. @$(CC) -DSHARED -fPIC -c $< -o $@
  117. $(OBJ_DIR)/%.o: %.c $(headers)
  118. @mkdir -p $(OBJ_DIR)
  119. @echo [ $@ ]
  120. @$(CC) $(CFLAGS) $(defs) -c $< -o $@ $(CFLAGS-suffix)
  121. $(OBJ_DIR)/%.e $(OBJ_DIR)/%.i: %.c $(headers)
  122. @mkdir -p $(OBJ_DIR)
  123. @echo [ $@ ]
  124. @$(CC) $(CFLAGS) $(defs) -E $< -o $@ $(CFLAGS-suffix)
  125. $(OBJ_DIR)/%.s: %.c $(headers)
  126. @mkdir -p $(OBJ_DIR)
  127. @echo [ $@ ]
  128. @$(CC) $(CFLAGS) $(defs) -S $< -o $@ $(CFLAGS-suffix)
  129. .PHONY: clean
  130. clean:
  131. rm -rf $(LIB_DIR) $(OBJ_DIR) $(files_to_build)
  132. @[ ! -d $(HOST_DIR) ] || $(MAKE) -C $(HOST_DIR) clean
  133. @[ ! -d security/$(PAL_HOST) ] || $(MAKE) -C security/$(PAL_HOST) clean