# # $Id: Makefile.Selftest 88 2008-12-10 18:31:39Z rosiere $ # # [ Description ] # # Makefile # #-----[ Directory ]---------------------------------------- DIR_BIN = $(DIR_TMP)/bin DIR_LIB = ../lib DIR_CFG_GEN = $(DIR_TMP)/configuration_generated DIR_CFG_USER = configuration DIR_LOG = log #-----[ Variables ]---------------------------------------- CFG_FILE_EXTENSION = cfg CFG_FILE_DEBUG = debug.$(CFG_FILE_EXTENSION) OBJECTS = $(OBJECTS_COMMON) EXEC_PREFIX = #$(VALGRIND) EXEC_PARAMS = $(SYSTEMC_EXEC_PARAMS_$(SIMULATOR)) EXEC_LOG = $(patsubst $(DIR_CFG_GEN)/%.cfg,$(DIR_LOG)/%.exec.log,$(wildcard $(DIR_CFG_GEN)/*.cfg)) \ $(patsubst $(DIR_CFG_USER)/%.cfg,$(DIR_LOG)/%.exec.log,$(wildcard $(DIR_CFG_USER)/*.cfg)) EXEC = soft #-----[ Rules ]-------------------------------------------- .PRECIOUS : $(DIR_BIN)/%.x $(DIR_LOG)/%.exec.log #.NOTPARALLEL : clean clean_all help all_selftest : test_env $(DIR_OBJ) $(DIR_BIN) $(DIR_LOG) @\ $(MAKE) library;\ $(MAKE) $(DIR_BIN)/$(EXEC).x; execute_only : @\ $(MAKE) $(EXEC_LOG); \ declare -i all_ok=1; \ for i in $(EXEC_LOG); do \ $(GREP) -q "Test OK" $$i; \ declare -i test_ok=$$?; \ $(GREP) -q "Test KO" $$i; \ declare -i test_ko=$$?; \ $(GREP) -q "ERROR" $$i; \ declare -i test_error=$$?; \ if $(TEST) $$test_ko -eq 0 -o $$test_error -eq 0 -o $$test_ok -ne 0; \ then all_ok=0; \ fi; \ done; \ if $(TEST) $$all_ok -eq 1; \ then $(ECHO) "-------------------| Test OK"; exit 0; \ else $(ECHO) "-------------------| Test KO"; exit 1; \ fi; execute : all_selftest @\ $(MAKE) execute_only; reconfig : @\ $(MAKE) config_clean;\ $(MAKE) config; config_clean : @$(RM) $(DIR_CFG_GEN) config : $(DIR_CFG_GEN) @\ $(ECHO) "Generate configuration"; \ declare -i CPT=0; \ declare files; \ \ if $(TEST) -f $(CFG_FILE_DEBUG); then \ files=$(CFG_FILE_DEBUG); \ else \ files=$$($(LS) *.$(CFG_FILE_EXTENSION) ); \ fi; \ \ declare -i NB_CONFIG=0; \ declare -i NB_DIGIT=0; \ \ for file in $${files}; do \ declare -ai PERIOD=(); \ declare -i IT=0; \ \ PERIOD[0]=1; \ \ while read line; do \ declare -a LINE=($${line}); \ \ if $(TEST) $${IT} -ne 0; then \ declare -a RANGE_LOCAL=($$($(DIR_SCRIPT)/range.sh $${LINE[0]} $${LINE[1]} $${LINE[2]})); \ declare -i SIZE=$${#RANGE_LOCAL[*]}; \ PERIOD[$${IT}]=$$(($${PERIOD[$$(($${IT}-1))]}*$${SIZE})); \ fi; \ \ IT=$$(($${IT}+1)); \ done < $${file}; \ \ NB_CONFIG=$$(($${NB_CONFIG} + $${PERIOD[$$(($${IT}-1))]})); \ done; \ \ $(ECHO) " * They are $${NB_CONFIG} configurations"; \ \ declare -i x=$${NB_CONFIG}; \ \ while test $${x} -ne 0; do \ NB_DIGIT=$$(($${NB_DIGIT} + 1)); \ x=$$(($${x} / 10)); \ done; \ \ for file in $${files}; do \ declare NAME; \ declare -ai MIN=(); \ declare -ai PERIOD=(); \ declare -a RANGE_LOCAL=(); \ declare -a RANGE=(); \ declare -a SIZE=(); \ declare -i IT=0; \ \ PERIOD[0]=1; \ \ while read line; do \ declare -a LINE=($${line}); \ \ if $(TEST) $${IT} -eq 0; then \ NAME=$${LINE[0]}; \ else \ MIN[$${IT}]=$${LINE[0]}; \ RANGE[$${IT}]=$$($(DIR_SCRIPT)/range.sh $${LINE[0]} $${LINE[1]} $${LINE[2]}); \ RANGE_LOCAL=($${RANGE[$${IT}]}); \ SIZE[$${IT}]=$${#RANGE_LOCAL[*]}; \ PERIOD[$${IT}]=$$(($${PERIOD[$$(($${IT}-1))]}*$${SIZE[$${IT}]})); \ fi; \ \ IT=$$(($${IT}+1)); \ done < $${file}; \ \ declare -a DATA=(); \ declare -ai ENUM_CONFIG=($$($(DIR_SCRIPT)/range.sh 0 $$(($${PERIOD[$$(($${IT}-1))]}-1)))); \ declare -ai ENUM_PARAM=($$($(DIR_SCRIPT)/range.sh 1 $${#MIN[*]})); \ declare -i NB_PARAM=$${#MIN[*]}; \ \ $(ECHO) " * File : $$file"; \ $(ECHO) " * They are $${NB_PARAM} parameters"; \ $(ECHO) " * Generate $${PERIOD[$$(($${IT}-1))]} configurations"; \ \ for i in $${ENUM_CONFIG[*]}; do \ x=$$i; \ for j in $${ENUM_PARAM[*]}; do \ declare -a RANGE_LOCAL=($${RANGE[$$j]}); \ DATA[$$j]="$${RANGE_LOCAL[$$((($$x % $${SIZE[$$j]})))]} "; \ x=$$(($$x/$${SIZE[$$j]})); \ done; \ declare NUM=$$($(PRINTF) %.$${NB_DIGIT}d $${CPT}); \ $(ECHO) $${DATA[*]} > "$(DIR_CFG_GEN)/$${NAME}_$${NUM}.cfg"; \ $(ECHO) " - {$${NUM}} $${DATA[*]}"; \ CPT=$$(($${CPT}+1)); \ done; \ done; $(DIR_LOG)/%.exec.log : $(DIR_CFG_GEN)/%.cfg $(DIR_BIN)/$(EXEC).x @\ $(ECHO) "Execute : $*";\ export SYSTEMC=$(SYSTEMC_$(SIMULATOR)); $(EXEC_PREFIX) $(DIR_BIN)/$(EXEC).x $(EXEC_PARAMS) $* `$(CAT) $<` &> $@; \ declare timing=`$(GREP) -h "Timing" $@`; \ $(GREP) -q "Test OK" $@; \ declare -i test_ok=$$?; \ $(GREP) -q "Test KO" $@; \ declare -i test_ko=$$?; \ $(GREP) -q "ERROR" $@; \ declare -i test_error=$$?; \ if $(TEST) $$test_ko -ne 0 -a $$test_error -ne 0 -a $$test_ok -eq 0; \ then echo -e " $* ... OK\t$$timing";\ else echo " $* ... KO"; \ fi; $(DIR_LOG)/%.exec.log : $(DIR_CFG_USER)/%.cfg $(DIR_BIN)/$(EXEC).x @\ $(ECHO) "Execute : $*";\ export SYSTEMC=$(SYSTEMC_$(SIMULATOR)); $(EXEC_PREFIX) $(DIR_BIN)/$(EXEC).x $(EXEC_PARAMS) $* `$(CAT) $<` &> $@; \ declare timing=`$(GREP) -h "Timing" $@`; \ $(GREP) -q "Test OK" $@; \ declare -i test_ok=$$?; \ $(GREP) -q "Test KO" $@; \ declare -i test_ko=$$?; \ $(GREP) -q "ERROR" $@; \ declare -i test_error=$$?; \ if $(TEST) $$test_ko -ne 0 -a $$test_error -ne 0 -a $$test_ok -eq 0; \ then $(ECHO) -e " $* ... OK\t$$timing";\ else $(ECHO) " $* ... KO"; \ fi; $(DIR_BIN)/%.x : $(OBJECTS) $(HEADERS) $(DIR_LIB) @\ $(ECHO) "Linkage : $*";\ $(CXX) $(LFLAGS) -o $@ $(OBJECTS) $(LIBS); $(DIR_LIB) : @\ $(ECHO) "Create directory : $@";\ $(MKDIR) $@; $(DIR_BIN) : @\ $(ECHO) "Create directory : $@";\ $(MKDIR) $@; $(DIR_LOG) : @\ $(ECHO) "Create directory : $@";\ $(MKDIR) $@; $(DIR_CFG_GEN) : @\ $(ECHO) "Create directory : $@";\ $(MKDIR) $@; selftest_clean : local_clean config_clean @$(RM) $(DIR_LOG) \ $(DIR_CFG_USER)/*~ \ *.vhdl \ *.pos \ *.stat \ *.log \ *.dot \ *.txt \ generated_by_systemcass \ semantic.cache \ core*; selftest_clean_all : library_clean selftest_help : @\ $(ECHO) " -----[ Selftest ]-----------------------------------";\ $(ECHO) "";\ $(ECHO) " * all_selftest : compile all c++ file and execute";\ $(ECHO) " * execute : execute all instance";\ $(ECHO) " * execute_only : execute all instance without rebuild all libraries";\ $(ECHO) " * config : generate configuration with configuration's file" ;\ $(ECHO) " * reconfig : regenerate configuration with configuration's file" ;\ $(ECHO) " * clean : Erase all generate files";\ $(ECHO) " * clean_all : Clean + Erase all dependant library";\ $(ECHO) " * help : print this text";\ $(ECHO) ""; help : @\ $(MAKE) common_help ; \ $(MAKE) synthesis_help;\ $(MAKE) selftest_help; clean : @\ $(MAKE) common_clean ;\ $(MAKE) synthesis_clean ;\ $(MAKE) selftest_clean; clean_all : @\ $(MAKE) clean ;\ $(MAKE) selftest_clean_all;