# # $Id: Makefile.Selftest 145 2010-10-13 18:15:51Z rosiere $ # # [ Description ] # # Makefile # #-----[ Directory ]---------------------------------------- DIR_BIN = $(DIR_TMP)/bin/$(ENTITY) DIR_CFG_GEN = $(DIR_TMP)/configuration_generated/$(ENTITY) DIR_CFG_USER = configuration DIR_LOG = log #-----[ Variables ]---------------------------------------- CFG_FILE_PATH = $(DIR_CFG_USER) CFG_FILE_EXTENSION = gen CFG_FILE_DEBUG = $(CFG_FILE_PATH)/debug.$(CFG_FILE_EXTENSION) OBJECTS = $(OBJECTS_COMMON) LIBS = -lm $(SYSTEMC_LIBNAME_$(SIMULATOR_SYSTEMC)) MODELTECH_LIBRARY = $(addprefix -lib ,$(addsuffix .a, $(subst -l,$(DIR_LIB)/lib,$(LIBRARY)))) #MODELTECH_LIBRARY = $(LIBRARY) EXEC_PREFIX = #$(VALGRIND) EXEC_PARAMS = $(SYSTEMC_EXEC_PARAMS_$(SIMULATOR_SYSTEMC)) 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_GEN)/*.cfg)) BIN = Selftest.x EXEC = $(DIR_BIN)/$(BIN) #-----[ Rules ]-------------------------------------------- .PRECIOUS : $(DIR_BIN)/%.x $(DIR_LOG)/%.exec.log #.NOTPARALLEL : clean clean_all help vpath %.x $(DIR_BIN) all_selftest : test_env $(DIR_OBJ) $(DIR_BIN) $(DIR_LOG) @\ $(MAKE) library;\ $(MAKE) $(EXEC); execute_only : @\ $(MAKE) $(EXEC_LOG);\ declare -i all_ok=1; \ for i in $(EXEC_LOG); do \ $(GREP) -q "Timing" $$i; \ declare -i test_timing=$$?; \ $(GREP) -q "Test OK" $$i; \ declare -i test_ok=$$?; \ $(GREP) -q "Test KO" $$i; \ declare -i test_ko=$$?; \ if $(TEST) $$test_ko -eq 0 -o $$test_ok -ne 0 -o $$test_timing -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_PATH)/*.$(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 $(EXEC) @\ $(ECHO) "Execute : $*";\ export SYSTEMC=$(SYSTEMC_$(SIMULATOR_SYSTEMC)); $(EXEC_PREFIX) $(EXEC) $(EXEC_PARAMS) $* `$(CAT) $<` &> $@; \ declare timing=`$(GREP) -h "Timing" $@`; \ $(GREP) -q "Timing" $@; \ declare -i test_timing=$$?; \ $(GREP) -q "Test OK" $@; \ declare -i test_ok=$$?; \ $(GREP) -q "Test KO" $@; \ declare -i test_ko=$$?; \ declare memory_leak=" "; \ $(GREP) -q "Leaked memory at" $@; \ if $(TEST) $$? -eq 0; \ then memory_leak="*"; \ fi; \ if $(TEST) $$test_ko -ne 0 -a $$test_ok -eq 0 -a $$test_timing -eq 0; \ then echo -e " $* ... OK $$memory_leak\t$$timing";\ else echo " $* ... KO"; \ fi; $(DIR_BIN)/%.x : $(SOURCES) $(HEADERS) $(DIR_OBJ) $(DIR_BIN) @\ $(ECHO) "Linkage : $*";\ case "${SIMULATOR_SYSTEMC}" in \ "modelsim") \ $(MAKE) vhdl_package; \ $(MAKE) vhdl_entity; \ $(MODELTECH_SCCOM) -work $(DIR_WORK) $(CFLAGS) $(SOURCES); \ $(MODELTECH_SCCOM) -work $(DIR_WORK) $(MODELTECH_LIBRARY) $(LFLAGS) $(LIBS) -link;\ $(ECHO) "#!$(SHELL)" > $@; \ $(ECHO) "cd $${PWD};" >> $@; \ $(ECHO) 'declare args;' >> $@; \ $(ECHO) 'for i in $${*}; do' >> $@; \ $(ECHO) ' args=$${args}" -sc_arg $${i}";' >> $@; \ $(ECHO) 'done;' >> $@; \ $(ECHO) "$(MODELTECH_VSIM) -novopt "'$${args}'" $(MODELTECH_LIBRARY) $(DIR_WORK).top;" >> $@; \ $(ECHO) "cd -;" >> $@; \ $(CHMOD) +x $@; \ ;; \ *) \ $(MAKE) $(OBJECTS); \ $(SYSTEMC_CXX_$(SIMULATOR_SYSTEMC)) $(LFLAGS) -o $@ $(OBJECTS) $(LIBRARY) $(LIBS);\ ;; \ esac; $(DIR_BIN) $(DIR_LOG) : @\ $(ECHO) "Create directory : $@";\ $(MKDIR) $@;\ $(DIR_CFG_GEN) : @\ $(ECHO) "Create directory : $@";\ $(MKDIR) $@;\ $(LS) $(DIR_CFG_USER)/*.cfg &> /dev/null; \ if $(TEST) $$? -eq 0; then \ $(CP) $(DIR_CFG_USER)/*.cfg $@; \ fi; selftest_clean : local_clean config_clean @$(RM) $(DIR_LOG) \ $(DIR_CFG_USER)/*~ \ $(EXEC) \ *.vhdl \ *.pos \ *.stat \ *.log \ *.dot \ *.txt \ generated_by_systemcass \ semantic.cache \ gmon.out \ core*; selftest_clean_all : library_clean @\ $(RM) $(DIR_BIN) 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;