# common definition
include			Makefile.morpheo

#-----[ Directory ]---------------------------------------------------------------

DIR_LOCAL    		= .
DIR_LOCAL_C		= $(DIR_LOCAL)/src/c
DIR_LOCAL_ASM		= $(DIR_LOCAL)/src/asm
DIR_LOCAL_SYS		= $(DIR_LOCAL)/src/sys
DIR_LOCAL_INC       	= $(DIR_LOCAL)/src/c/include

DIR_GLOBAL     		= $(SOFT)/Global.or32
DIR_GLOBAL_C		= $(DIR_GLOBAL)/src/c
DIR_GLOBAL_ASM		= $(DIR_GLOBAL)/src/asm
DIR_GLOBAL_SYS		= $(DIR_GLOBAL)/src/sys
DIR_GLOBAL_INC       	= $(DIR_GLOBAL)/include

DIR_INC			= -I$(DIR_LOCAL_INC) -I$(DIR_GLOBAL_INC)
DIR_OBJ			= obj
DIR_BIN			= bin

EXE			= soft

#-----[ Files ]-------------------------------------------------------------------
OBJ_ASM			= $(patsubst $(DIR_LOCAL_ASM)/%.s,$(DIR_OBJ)/%.o,$(wildcard $(DIR_LOCAL_ASM)/*.s))	\
			  $(patsubst $(DIR_GLOBAL_ASM)/%.s,$(DIR_OBJ)/%.o,$(wildcard $(DIR_GLOBAL_ASM)/*.s))
OBJ_SYS			= $(patsubst $(DIR_LOCAL_SYS)/%.s,$(DIR_OBJ)/%.o,$(wildcard $(DIR_LOCAL_SYS)/*.s))	\
			  $(patsubst $(DIR_GLOBAL_SYS)/%.s,$(DIR_OBJ)/%.o,$(wildcard $(DIR_GLOBAL_SYS)/*.s))
OBJ_C           	= $(patsubst $(DIR_LOCAL_C)/%.c,$(DIR_OBJ)/%.o,$(wildcard $(DIR_LOCAL_C)/*.c))		\
			  $(patsubst $(DIR_GLOBAL_C)/%.c,$(DIR_OBJ)/%.o,$(wildcard $(DIR_GLOBAL_C)/*.c))

OBJ			= $(OBJ_SYS) $(OBJ_ASM) $(OBJ_C)

#-----[ Rules ]-------------------------------------------------------------------
.PRECIOUS		: $(DIR_BIN)/%.x $(DIR_OBJ)/%.o $(DIR_OBJ)/%.a

all 			: test_env $(DIR_BIN)/$(EXE).x.txt

$(DIR_BIN)/%.x.txt	: $(DIR_BIN)/%.x
			@\
			$(ECHO) "List symbols        of $*";\
			$(NM)      $(NM_OPT)      $^ > $@.nm;\
			$(ECHO) "Display information of $*";\
			$(OBJDUMP) $(OBJDUMP_OPT) $^ > $@;

$(DIR_BIN)/%.x		: $(OBJ_SYS) $(OBJ) 
			@\
			$(ECHO) "Linkage             of $*";\
			$(LD) -o $@ $^ $(LD_OPT);

$(DIR_OBJ)/%.o		: $(DIR_LOCAL_ASM)/%.s	
			@\
			$(ECHO) "Compile             of $*";\
			$(CC) $(CC_OPT) $(DIR_INC)    -o $@   -c $^ ;\
			$(CC) $(CC_OPT) $(DIR_INC) -S -o $@.s -c $^ ;
#			@$(AS) $(AS_OPT) $^ -o $@

$(DIR_OBJ)/%.o		: $(DIR_LOCAL_SYS)/%.s	
			@\
			$(ECHO) "Compile             of $*";\
			$(CC) $(CC_OPT) $(DIR_INC)    -o $@   -c $^ ;\
			$(CC) $(CC_OPT) $(DIR_INC) -S -o $@.s -c $^ ;
#			@$(AS) $(AS_OPT) $^ -o $@

$(DIR_OBJ)/%.o		: $(DIR_LOCAL_C)/%.c
			@\
			$(ECHO) "Compile             of $*";\
			$(CC) $(CC_OPT) $(DIR_INC)    -o $@   -c $^ ;\
			$(CC) $(CC_OPT) $(DIR_INC) -S -o $@.s -c $^ ;

$(DIR_OBJ)/%.o		: $(DIR_GLOBAL_ASM)/%.s	
			@\
			$(ECHO) "Compile             of $*";\
			$(CC) $(CC_OPT) $(DIR_INC)    -o $@   -c $^ ;\
			$(CC) $(CC_OPT) $(DIR_INC) -S -o $@.s -c $^ ;
#			@$(AS) $(AS_OPT) $^ -o $@

$(DIR_OBJ)/%.o		: $(DIR_GLOBAL_SYS)/%.s	
			@\
			$(ECHO) "Compile             of $*";\
			$(CC) $(CC_OPT) $(DIR_INC)    -o $@   -c $^ ;\
			$(CC) $(CC_OPT) $(DIR_INC) -S -o $@.s -c $^ ;
#			@$(AS) $(AS_OPT) $^ -o $@

$(DIR_OBJ)/%.o		: $(DIR_GLOBAL_C)/%.c
			@\
			$(ECHO) "Compile             of $*";\
			$(CC) $(CC_OPT) $(DIR_INC)    -o $@   -c $^ ;\
			$(CC) $(CC_OPT) $(DIR_INC) -S -o $@.s -c $^ ;

#-----[ Environement ]------------------------------------------------------------
test_env		:
# ifeq ($(origin TOOLS), undefined)
# 			$(error "variable TOOLS is undefined");
# endif
# ifeq ($(origin SOFT), undefined)
# 			$(error "variable SOFT  is undefined");
# endif
			@$(MKDIR) $(DIR_OBJ) $(DIR_BIN)

#-----[ Maintenance ]-------------------------------------------------------------
clean 			:
			@\
			$(ECHO) "Delete     temporary files              "`$(PWD)`;\
			$(RM) $(DIR_OBJ) $(DIR_BIN);\
			$(MAKE) clean_rec DIR_CLEAN=.;

#Clean recursive
clean_rec		:
			@\
			$(ECHO) "Delete     temporary files in directory $(DIR_CLEAN)";\
			$(RM) -f $(DIR_CLEAN)/*~;\
			for files in `$(LS) $(DIR_CLEAN)`; do					\
			    	if $(TEST) -d $(DIR_CLEAN)/$$files; 				\
				then 								\
					$(MAKE) clean_rec DIR_CLEAN=$(DIR_CLEAN)/$$files;	\
				fi; 								\
			done;

#-----[ Help ]--------------------------------------------------------------------
help			:
			@\
			$(ECHO) "";\
			$(ECHO) "List of directive   : ";\
			$(ECHO) " * make             : Compile the software";\
			$(ECHO) " * make clean       : Erase all files generates";\
			$(ECHO) " * make bench_list  : View all benchmark";\
			$(ECHO) " * make bench_exec  : Print the file \"$(FILE_BENCH)\" - it's the Workload";\
			$(ECHO) " * make bench       : Compile the Benchmark Suite";\
			$(ECHO) "";
