##############################################################################
#                                                                            #
# Copyright (C) 1996 ACTS-MoMuSys All Rights Reserved.                       #
#                                                                            #
# See COPYRIGHT file enclosed with this distribution.                        #
#                                                                            #
##############################################################################

##############################################################################
#                                                                            #
#  SLAVE MAKEFILE Version 1.6                                                #
#                                                                            #
#                                                                            #
#  CREATED BY :  Bruno LORET -- FRANCE TELECOM / CNET --  22-Feb-96          # 
#                                                                            #
#  DERIVED FROM WORK by Xavier MARICHAL -- UCL                               #
#                                                                            #
##############################################################################


##############################################################################
#                                                                            #
#                                                                            #
#                 NO CHANGE SHOULD BE NECESSARY IN THIS FILE                 #
#                                                                            #
#                                                                            #
##############################################################################


##############################################################################
# VARIABLES COMING FROM THE MASTER MAKEFILE                                  #
##############################################################################
# 
#
# CFLAGS
# CC
#
# EXTRA_INCLUDE_DIR
# LIB_EXT
#
# PROJECT_LIB_DIR
#
# CPROTO_BIN
# CPROTO_FLAGS
#
# MODULE_LIST
#
# CI
# VERSION
# REVISION_MESSAGE
# INITIAL_REVISION_MESSAGE
#

##############################################################################
# DEFINITION OF THE MODULE  STRUCTURE                                        #
##############################################################################
## Ex :
##     
##     ************       *******
##     * module_1 *-------* src *------ a.c
##     ************   |   *******       b.c
##                    |
##                    |   ***********
##                     ---* include *------ x.h
##                        ***********   |   y.h
##                                      |
##                                      |  *********
##                                       --* proto *----- a.p
##                                         *********      b.p
##                         
##                         


SRC_PATH=	$(MODULE)/src
INCLUDE_PATH=	$(MODULE)/include
PROTO_PATH=	$(INCLUDE_PATH)/proto

SRC_EXT=	.c
OBJ_EXT=	.o
INCLUDE_EXT=	.h
PROTO_EXT=	.p


## List of all C files of the module (with relative path)                   ##
## Ex: module_1/src/a.c module_1/src/b.c                                    ##
FILES_SRC=	$(shell ls $(SRC_PATH)/*$(SRC_EXT))

## List of all header files of the module (with relative path)              ##
## Ex: module_1/include/x.h module_1/include/y.h                            ##
FILES_INCLUDE=	$(shell ls $(INCLUDE_PATH)/*$(INCLUDE_EXT))

## List of all files names of the module (no path, no suffix)               ##
## Ex: a b                                                                  ##
FILES=		$(subst $(SRC_PATH)/,,$(subst $(SRC_EXT),,$(FILES_SRC)))

## List of all object files to generate (without path)                      ##
## Ex: a.o b.o                                                              ##
ALL_OBJ=	$(addsuffix $(OBJ_EXT),$(FILES))

## List of all prototype files to generate (with relative path)             ##
## Ex: module_1/include/proto/a.p module_1/include/proto/b.p                ##
ALL_PROTO=	$(addprefix $(PROTO_PATH)/, $(addsuffix $(PROTO_EXT), $(FILES)))

## Path to other modules include directory (with relative path)             ##
## Ex: -Imodule_2/include -Imodule_3/include                                ##
## TODO : "include" as variable
GLOBAL_INCLUDE_PATH= $(addprefix -I, $(addsuffix /include, $(MODULE_LIST)))

## Path to other modules prototype directory (with relative path)           ##
## Ex: -Imodule_2/include/proto -Imodule_3/include/proto                    ##
## TODO : "proto" as variable
GLOBAL_PROTO_PATH=   $(addsuffix /proto, $(GLOBAL_INCLUDE_PATH))

## Name of the library to build (with relative path)                        ##
## Ex: lib/lib_sol2_dbg/libModule_1.a                                       ##
MODULE_LIB=	$(PROJECT_LIB_DIR)/lib$(MODULE)$(LIB_EXT)


TOTAL_INCLUDE_PATH= -I"$(INCLUDE_PATH)" -I"$(PROTO_PATH)" $(GLOBAL_INCLUDE_PATH) $(GLOBAL_PROTO_PATH) $(EXTRA_INCLUDE_DIR)

##############################################################################
# TARGETS                                                                    #
##############################################################################

 
 
compiling: display_variables check_project_structure $(MODULE_LIB)($(ALL_OBJ)) 

prototypes: check_project_structure $(ALL_PROTO)

##############################################################################
# COMPILATION TARGET : GENERATION OF THE LIBRARY                             #
##############################################################################
## Compile objects files from source files and store them in the library    ##
## Dependency : - corresponding source file                                 ## 
##              - ALL the include files of the module                       ##
## TODO: make dependency only from the included header files                ##
##                       but from any modules                               ##
$(MODULE_LIB)(%$(OBJ_EXT)): $(SRC_PATH)/%$(SRC_EXT) $(FILES_INCLUDE)
	@echo "         Compiling          :  $<"
	@$(CC) $(CFLAGS) -c $< $(TOTAL_INCLUDE_PATH)
	@$(AR) r $@ $%
	@$(RM) $%



##############################################################################
# PROTOTYPE GENERATION TARGET : GENERATION OF PROTOTYPE FILES                #
##############################################################################
## Extracting function prototypes from source files                         ##
## Automatization of the non-reentrant and extern "C" tricks                ##
## Store all this in a file                                                 ##
$(PROTO_PATH)/%$(PROTO_EXT): $(SRC_PATH)/%$(SRC_EXT)
	@echo "         Extracting prototypes from    :  $<"
	@echo "/*"                                                        > tmp.p 
	@echo " * This file was automatically generated by 'Makefile'."   >> tmp.p
	@echo " *"                                                        >> tmp.p
	@echo " * DO NOT EDIT BY HAND : your modifications will be lost." >> tmp.p
	@echo " *"                                                        >> tmp.p
	@echo " */"                                                       >> tmp.p
	@echo ""                              >> tmp.p
	@echo "#ifndef _$(basename $(@F))_P"  >> tmp.p
	@echo "#define _$(basename $(@F))_P"  >> tmp.p
	@echo ""                              >> tmp.p
	@echo "#ifdef __cplusplus"            >> tmp.p
	@echo 'extern "C" {'                  >> tmp.p
	@echo "#endif /* __cplusplus */"      >> tmp.p
	@echo ""                              >> tmp.p
	@echo ""                              >> tmp.p
	@$(CPROTO_BIN) $(CPROTO_FLAGS) -I$(INCLUDE_PATH) -I$(PROTO_PATH) $(GLOBAL_INCLUDE_PATH) $(GLOBAL_PROTO_PATH) $(EXTRA_INCLUDE_DIR) $< >> tmp.p
	@echo ""                              >> tmp.p
	@echo "#ifdef __cplusplus"            >> tmp.p
	@echo "}"                             >> tmp.p
	@echo "#endif /* __cplusplus  */ "    >> tmp.p
	@echo "#endif /* _$(basename $(@F))_P  */ "       >> tmp.p
	@mv tmp.p $@


##############################################################################
###  RCS check in target                                                   ###
##############################################################################
## Perform a complet RCS check in of the source and include directories     ##
RCS_check_in: 
	@[ -d $(SRC_PATH)/RCS ] ||  mkdir -p $(SRC_PATH)/RCS; 
	@$(CI) -u -f$(VERSION) -m$(REVISION_MESSAGE) -t-$(INITIAL_REVISION_MESSAGE) $(FILES_SRC);
	@[ -d $(INCLUDE_PATH)/RCS ] ||  mkdir -p $(INCLUDE_PATH)/RCS; 
	@$(CI) -u -f$(VERSION) -m$(REVISION_MESSAGE) -t-$(INITIAL_REVISION_MESSAGE) $(FILES_INCLUDE);

##############################################################################
#  CHECK TARGET                                                              #
##############################################################################
## check consistency between source files/prototype file/object files       ##
## one source file gives one prototype file and one object file             ##
## What is checked is extra prototype files and extra object files          ##
check:	
	@CLEAN=NO;\
	$(CHECK_PROTO_MACRO) \
	$(CHECK_LIB_MACRO)

##############################################################################
#  CHECK_AND_CLEAN TARGET                                                    #
##############################################################################
## Same as above plus clarification of the situation                        ##
check_and_clean:	
	@CLEAN=YES;\
	$(CHECK_PROTO_MACRO) \
	$(CHECK_LIB_MACRO)



## Shell macros used for the check and clean process                        ##
CHECK_PROTO_MACRO= \
	echo ;\
	for p in $(shell ls $(PROTO_PATH)/*); do \
	   base="`basename $$p $(PROTO_EXT)`"; \
	   if test ! -f $(SRC_PATH)/$${base}$(SRC_EXT); then \
	      echo "Found Prototype file $${base}$(PROTO_EXT) but $${base}$(SRC_EXT) does not exist" ; \
	      if [ $${CLEAN} = "YES" ]; then \
	         echo " ==> delete it "; \
	         `rm $$p`; \
	      fi;\
	   fi;\
	done ; 

CHECK_LIB_MACRO= \
	echo ;\
	if test -f $(MODULE_LIB) ; then \
	   FILE_LIST="$(shell $(AR) -t $(MODULE_LIB))"; \
	   for p in $${FILE_LIST}; do \
	      base="`basename $$p $(OBJ_EXT)`"; \
	      if test ! -f $(SRC_PATH)/$${base}$(SRC_EXT); then \
	         echo "Found library module $${base}$(OBJ_EXT) but $${base}$(SRC_EXT) does not exist" ; \
	         if [ $${CLEAN} = "YES" ]; then \
	            echo " ==> delete it "; \
	            `$(AR) -d $(MODULE_LIB) $${base}$(OBJ_EXT)`; \
	         fi;\
	      fi;\
	   done ;\
	else \
	   echo "ERROR : $(MODULE_LIB) does not exist"; \
	fi; \
	echo ;


##############################################################################
# CHECK_PROJECT_STRUCTURE TARGET                                             #
##############################################################################
## Creation of the lib and proto directories if necessary                    #
check_project_structure: 
	@- [ -d $(PROJECT_LIB_DIR) ] ||  mkdir -p $(PROJECT_LIB_DIR) ; 
	@- [ -d $(PROTO_PATH) ] ||  mkdir -p $(PROTO_PATH) ; 



##############################################################################
#  DISPLAY_VARIABLES TARGET : for comment and debugging                      #
##############################################################################
display_variables: 
	@echo '         FILES              :  $(FILES)'
	@echo '         TOTAL_INCLUDE_PATH :  $(TOTAL_INCLUDE_PATH)'
	@echo '         CFLAGS             :  $(CFLAGS)'	
#
#	@echo '         MODULE       :  $(MODULE)'
#
#	@echo '         FILES_SRC    :  $(FILES_SRC)'
#	@echo '         FILES_INCLUDE:  $(FILES_INCLUDE)'
#	@echo '         ALL_OBJ      :  $(ALL_OBJ)'
#	@echo '         ALL_PROTO    :  $(ALL_PROTO)'
#
#	@echo '         MODULE_LIB   :  $(MODULE_LIB)'
#	@echo '         SRC_PATH     :  $(SRC_PATH)'
#	@echo '         INCLUDE_PATH :  $(INCLUDE_PATH)'
#	@echo '         GLOBAL_INCLUDE_PATH :  $(GLOBAL_INCLUDE_PATH)'
#	@echo '         PROTO_PATH   :  $(PROTO_PATH)'
#	@echo '         GLOBAL_PROTO_PATH :  $(GLOBAL_PROTO_PATH)'
#

