|  | @@ -2,16 +2,10 @@ export PAL_DIR = $(CURDIR)
 | 
	
		
			
				|  |  |  export RUNTIME_DIR = $(CURDIR)/../../Runtime
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  include Makefile.Host
 | 
	
		
			
				|  |  | --include Makefile.Status
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -ifeq ($(DEBUG),1)
 | 
	
		
			
				|  |  | -BUILD_TARGET = $(PAL_HOST)-debug
 | 
	
		
			
				|  |  | -else
 | 
	
		
			
				|  |  | -BUILD_TARGET = $(PAL_HOST)
 | 
	
		
			
				|  |  | -endif
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  # Customizable PAL Targets
 | 
	
		
			
				|  |  |  # (specify in Makefile.am in host-specific directories)
 | 
	
		
			
				|  |  | +# For concurrent builds, all PAL targets must be in host-specific directories
 | 
	
		
			
				|  |  |  pal_loader =
 | 
	
		
			
				|  |  |  pal_sec =
 | 
	
		
			
				|  |  |  pal_lib =
 | 
	
	
		
			
				|  | @@ -22,12 +16,21 @@ pal_gdb =
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  include host/$(PAL_HOST)/Makefile.am
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -CFLAGS	+= -I. -I../include -Ihost/$(PAL_HOST) -I../lib
 | 
	
		
			
				|  |  | +HOST_DIR = host/$(PAL_HOST)
 | 
	
		
			
				|  |  | +LIB_DIR = $(HOST_DIR)/.lib
 | 
	
		
			
				|  |  | +OBJ_DIR = $(HOST_DIR)/.obj
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +CFLAGS	+= -I. -I../include -I$(HOST_DIR) -I../lib
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ifeq ($(PROFILING),1)
 | 
	
		
			
				|  |  |  CFLAGS	+= -DPROFILING=1
 | 
	
		
			
				|  |  |  endif
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +# Build Targets:
 | 
	
		
			
				|  |  | +#     (1) Host-specific targets are in "host/{Host Name}".
 | 
	
		
			
				|  |  | +#     (2) Generic targets are in "host/{Host Name}/.obj".
 | 
	
		
			
				|  |  | +#     (3) API library targets are in "host/{Host Name}/.lib".
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  files_to_build = $(pal_lib) $(pal_lib_post) $(pal_static) \
 | 
	
		
			
				|  |  |  		 $(pal_loader) $(pal_sec)
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -35,9 +38,10 @@ defs	= -DIN_PAL -DHOST_TYPE="$(PAL_HOST)" -D$(PAL_HOST_MACRO) -DPAL_DIR=$(PAL_DI
 | 
	
		
			
				|  |  |  	  -DRUNTIME_DIR=$(RUNTIME_DIR)
 | 
	
		
			
				|  |  |  objs	= $(addprefix db_,streams memory threading mutex events process \
 | 
	
		
			
				|  |  |  	    object main misc ipc exception rtld) slab printf
 | 
	
		
			
				|  |  | -graphene_lib = .lib/graphene-lib.a
 | 
	
		
			
				|  |  | -host_lib = host/$(PAL_HOST)/libpal-$(PAL_HOST).a
 | 
	
		
			
				|  |  | -headers	= $(wildcard *.h) $(wildcard ../lib/*.h) host/$(PAL_HOST)/pal_host.h
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +graphene_lib = $(LIB_DIR)/graphene-lib.a
 | 
	
		
			
				|  |  | +host_lib = $(HOST_DIR)/libpal-$(PAL_HOST).a
 | 
	
		
			
				|  |  | +headers	= $(wildcard *.h) $(wildcard ../lib/*.h) $(HOST_DIR)/pal_host.h
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ifeq ($(findstring x86_64,$(SYS))$(findstring linux,$(SYS)),x86_64linux)
 | 
	
		
			
				|  |  |  files_to_build += user_start.o user_shared_start.o
 | 
	
	
		
			
				|  | @@ -49,6 +53,12 @@ CFLAGS += -DDEBUG
 | 
	
		
			
				|  |  |  endif
 | 
	
		
			
				|  |  |  export DEBUG
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +# Install Targets (all in RUNTIME_DIR):
 | 
	
		
			
				|  |  | +#       pal-{Host Name}:       loader for PAL (as an executable)
 | 
	
		
			
				|  |  | +#       libpal-{Host Name}.so: dynamic-linking library
 | 
	
		
			
				|  |  | +#       pal_sec-{Host Name}:   secure loader for PAL (as an executable)
 | 
	
		
			
				|  |  | +#       pal_gdb-{Host Name}:   debugger for PAL (as an executable)
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  runtime_loader = $(RUNTIME_DIR)/pal-$(PAL_HOST)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ifneq ($(pal_lib),)
 | 
	
	
		
			
				|  | @@ -65,30 +75,22 @@ endif
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  files_to_install = $(runtime_loader) $(runtime_lib) $(runtime_sec) $(runtime_gdb)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -.PHONY: all
 | 
	
		
			
				|  |  | -all: | check_target $(files_to_build) $(files_to_install)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -ifndef SAVED_TARGET
 | 
	
		
			
				|  |  | -SAVED_TARGET = $(BUILD_TARGET)
 | 
	
		
			
				|  |  | -endif
 | 
	
		
			
				|  |  | +###########################
 | 
	
		
			
				|  |  | +##  Generic Build Rules  ##
 | 
	
		
			
				|  |  | +###########################
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -SAVED_OS = $(patsubst %-debug,%,$(SAVED_TARGET))
 | 
	
		
			
				|  |  | +.PHONY: all
 | 
	
		
			
				|  |  | +all: $(files_to_build) $(files_to_install)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -.PHONY: check_target
 | 
	
		
			
				|  |  | -check_target:
 | 
	
		
			
				|  |  | -	@echo "Building target: $(BUILD_TARGET)"
 | 
	
		
			
				|  |  | -ifneq ($(SAVED_TARGET),$(BUILD_TARGET))
 | 
	
		
			
				|  |  | -	$(error "A different target is built earlier. Prune the directory first.")
 | 
	
		
			
				|  |  | -endif
 | 
	
		
			
				|  |  | -	@echo "SAVED_TARGET = $(BUILD_TARGET)" > Makefile.Status
 | 
	
		
			
				|  |  | +$(LIB_DIR)/host_endian.h: $(HOST_DIR)/host_endian.h
 | 
	
		
			
				|  |  | +	@mkdir -p $(LIB_DIR)
 | 
	
		
			
				|  |  | +	cp -f $< $@
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  .PHONY: $(host_lib) $(graphene_lib) $(pal_lib) $(pal_sec)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -$(graphene_lib): host_endian.h
 | 
	
		
			
				|  |  | -	$(MAKE) -C ../lib target=$(shell pwd)/.lib/
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -host_endian.h: host/$(PAL_HOST)/host_endian.h
 | 
	
		
			
				|  |  | -	ln -sf $< $@
 | 
	
		
			
				|  |  | +$(graphene_lib): $(LIB_DIR)/host_endian.h
 | 
	
		
			
				|  |  | +	$(MAKE) -C ../lib target=$(abspath $(LIB_DIR))/
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  $(host_lib): $(graphene_lib)
 | 
	
		
			
				|  |  |  	@[ ! -d host/$(PAL_HOST) ] || $(MAKE) -C host/$(PAL_HOST)
 | 
	
	
		
			
				|  | @@ -99,7 +101,8 @@ $(runtime_loader): $(pal_loader)
 | 
	
		
			
				|  |  |  	cp -f $< $@
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ifneq ($(pal_lib),)
 | 
	
		
			
				|  |  | -$(pal_lib): $(addsuffix .o,$(objs)) $(host_lib) $(graphene_lib) $(pal_lib_deps)
 | 
	
		
			
				|  |  | +$(pal_lib): $(addprefix $(OBJ_DIR)/,$(addsuffix .o,$(objs))) \
 | 
	
		
			
				|  |  | +	    $(host_lib) $(graphene_lib) $(pal_lib_deps)
 | 
	
		
			
				|  |  |  	@echo [ $@ ]
 | 
	
		
			
				|  |  |  	$(LD) $(LDFLAGS) -o $@ $(filter-out %.map %.lds,$^) $(LDFLAGS-suffix)
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -126,15 +129,18 @@ endif
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  ifneq ($(pal_lib_post),)
 | 
	
		
			
				|  |  |  $(pal_lib_post): $(pal_lib)
 | 
	
		
			
				|  |  | -	$(MAKE) -C host/$(PAL_HOST) ../../$@
 | 
	
		
			
				|  |  | +	@$(MAKE) -C $(HOST_DIR) $@
 | 
	
		
			
				|  |  |  endif
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -$(pal_static): $(addsuffix .o,$(objs)) $(host_lib) $(graphene_lib)
 | 
	
		
			
				|  |  | +$(pal_static): $(addprefix $(OBJ_DIR)/,$(addsuffix .o,$(objs))) \
 | 
	
		
			
				|  |  | +	       $(host_lib) $(graphene_lib)
 | 
	
		
			
				|  |  |  	@echo [ $@ ]
 | 
	
		
			
				|  |  | -	$(AR) $(ARFLAGS) $@ $^ $(ARFLAGS-suffix)
 | 
	
		
			
				|  |  | +	@$(AR) $(ARFLAGS) $@ $^ $(ARFLAGS-suffix)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -%.asm: %.c $(headers)
 | 
	
		
			
				|  |  | -	$(CC) $(CFLAGS) $(defs) -c $< -o $<.o
 | 
	
		
			
				|  |  | +$(OBJ_DIR)/%.asm: %.c $(headers)
 | 
	
		
			
				|  |  | +	@mkdir -p $(OBJ_DIR)
 | 
	
		
			
				|  |  | +	@echo [ $@ ]
 | 
	
		
			
				|  |  | +	@$(CC) $(CFLAGS) $(defs) -c $< -o $<.o
 | 
	
		
			
				|  |  |  	@objdump -S $<.o > $@
 | 
	
		
			
				|  |  |  	@rm $<.o
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -146,19 +152,18 @@ user_shared_start.o: user_start.S
 | 
	
		
			
				|  |  |  	@echo [ $@ ]
 | 
	
		
			
				|  |  |  	@$(CC) -DSHARED -fPIC -c $< -o $@
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -%.o: %.c $(headers)
 | 
	
		
			
				|  |  | +$(OBJ_DIR)/%.o: %.c $(headers)
 | 
	
		
			
				|  |  | +	@mkdir -p $(OBJ_DIR)
 | 
	
		
			
				|  |  |  	@echo [ $@ ]
 | 
	
		
			
				|  |  |  	@$(CC) $(CFLAGS) $(defs) -c $< -o $@ $(CFLAGS-suffix)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -%.e: %.c $(headers)
 | 
	
		
			
				|  |  | +$(OBJ_DIR)/%.e: %.c $(headers)
 | 
	
		
			
				|  |  | +	@mkdir -p $(OBJ_DIR)
 | 
	
		
			
				|  |  |  	@echo [ $@ ]
 | 
	
		
			
				|  |  |  	@$(CC) $(CFLAGS) $(defs) -E $< -o $@ $(CFLAGS-suffix)
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  .PHONY: clean
 | 
	
		
			
				|  |  |  clean:
 | 
	
		
			
				|  |  | -ifneq ($(SAVED_OS),$(PAL_HOST))
 | 
	
		
			
				|  |  | -	$(MAKE) clean PAL_HOST=$(SAVED_OS)
 | 
	
		
			
				|  |  | -endif
 | 
	
		
			
				|  |  | -	rm -rf $(addsuffix .o,$(objs)) $(files_to_build) host_endian.h .lib Makefile.Status
 | 
	
		
			
				|  |  | -	@[ ! -d host/$(PAL_HOST) ] || $(MAKE) -C host/$(PAL_HOST) clean
 | 
	
		
			
				|  |  | +	rm -rf $(LIB_DIR) $(OBJ_DIR)
 | 
	
		
			
				|  |  | +	@[ ! -d $(HOST_DIR) ] || $(MAKE) -C $(HOST_DIR) clean
 | 
	
		
			
				|  |  |  	@[ ! -d security/$(PAL_HOST) ] || $(MAKE) -C security/$(PAL_HOST) clean
 |