2016-03-04 4 views
0

В настоящее время я работаю над make-файлом, который принимает параметр «CLASS = xxx», а затем компилирует и делает материал с этим значением. В конце концов, он запускает приложение ($ APP) в связке файлов.Makefile с несколькими значениями для параметра

Я введите команду:

make default CLASS=Test_UART 

и Makefile обрабатывает его таким образом:

pc: $(APP) 
    make -C BUILDENV CLASS=$(CLASS) BUILD=just_filelist OUTPUT=filelist.txt SKIPSELF=yes 
    ../classCvt/classCvt <./Applications/$(CLASS).class> ./Applications/$(CLASS).ujc 
    time -p ./$(APP) ./Applications/$(CLASS).ujc `cat filelist.txt` 

Следовательно, он вызывает Makefile в моей папке BUILDENV, которая делает следующее:

#USAGE: make -C <PATH_TO_THIS_FILES_PARENT_DIR> CLASS=<MY_JAVA_FILE_NAME_WITHOUT_JAVA_EXTENSION> OUT=<OUTPUT_FILE_NAME> 


SELF := $(dir $(CURDIR)/$(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST))) 
CLASS ?= PLEASE_SPECIFY_CLASS_PARAM 
DIR  := $(PWD)#print working directory 
CCVT ?= $(SELF)/../../classCvt/classCvt 
TOBIN ?= $(SELF)/../../classCvt/tobin 
OUTPUT ?= 

### Comment: Defining CMD. 
ifeq ($(BUILD), just_filelist) 
    CMD = echo 
else 
    ifeq ($(BUILD), PC) 
     CMD = echo 
    else 
     ifeq ($(BUILD), unopt) 

      CMD = $(TOBIN) 
     else 
      ### Comment: Optimized CMD = tobin -c ccvt 
      CMD = $(TOBIN) -c $(CCVT) 
     endif 
    endif 
endif 

ifeq ($(OUTPUT),) 
    OUT = &1 
else 
    OUT = $(DIR)/$(OUTPUT) 
endif 

ifeq ($(SKIPSELF), yes) 
    MYCLASS = 
else 
    MYCLASS = $(DIR)/Applications/$(CLASS).class 
endif 

all: 
    CLASSPATH=$(SELF)/RT/real:$(SELF)/RT/fake:$(DIR) javac $(DIR)/Applications/$(CLASS).java 
    find $(SELF)/RT/real -iname "*.class" -type f > $(SELF)/files 
    ls $(DIR)/Applications/*.class | grep -v "$(CLASS)\.class" >> $(SELF)/files || true 
    cat $(SELF)/files | xargs $(CMD) $(MYCLASS) >$(OUT) 
    rm -f $(SELF)/files 

Что я хотел бы сделать, это дать команду вроде:

make default CLASS=Test1,Test2,Test3 

и Makefile, чтобы обработать его для 3-х классов и поместить данные классов в .txt и классы по умолчанию в другом .txt, что-то вроде этого, как это:

pc: $(APP) 
    make -C BUILDENV default_classes BUILD=list_default_classes OUTPUT=list_default_classes.txt 
# make -C BUILDENV given_classes BUILD=list_given_classes OUTPUT=list_given_classes.txt CLASS=$(CLASS) SKIPSELF=yes 
    ../classCvt/classCvt `cat list_given_classes.txt`./Applications/$(CLASS).ujc 
    #here the list_given_classes should now contain the .ujc files 
    time -p ./$(APP) `cat list_given_classes.txt` `cat list_default_classes.txt` 

и для Makefile, в BUILDENV, я ожидал что-то вроде:

default_classes: 
     CLASSPATH=$(SELF)/RT/real:$(SELF)/RT/fake:$(DIR) 
     find $(SELF)/RT/real -iname "*.class" -type f > $(SELF)/files 
     ls $(DIR)/Applications/*.class | grep -v "$(CLASS1)\.class" "$(CLASS2)\.class">> $(SELF)/files || true 
     cat $(SELF)/files | xargs $(CMD) >$(OUT) 
     rm -f $(SELF)/files 

given_classes: 
    javac $(DIR)/Applications/$(CLASS).java 
    find $(SELF)/RT/real -iname "*.class" -type f > $(SELF)/files 
    ls $(DIR)/Applications/*.class | grep -v "$(CLASS)\.class" >> $(SELF)/files || true 
    cat $(SELF)/files | xargs $(CMD) $(MYCLASS) >$(OUT) 
    rm -f $(SELF)/files 

Однако, я не знаю, как сделать это для параметра класса, содержащего несколько классов. Я подумываю попробовать и проанализировать значение Test1, Test2, Test3 в списке 1,2,3, а затем повторить его. Но нет подсказки, если это хороший способ и даже о том, как это сделать. Что вы предлагаете?

ответ

0

Довольно путь:

pc: $(APP) 

define BUILD_CLASS 

pc: pc-$(CLASS_SPLIT) 

pc-$(CLASS_SPLIT): 
    make -C BUILDENV CLASS=$(CLASS_SPLIT) BUILD=just_filelist OUTPUT=filelist.txt SKIPSELF=yes 
    ../classCvt/classCvt <./Applications/$(CLASS_SPLIT).class> ./Applications/$(CLASS_SPLIT).ujc 
    time -p ./$(APP) ./Applications/$(CLASS_SPLIT).ujc `cat filelist.txt` 

endef 

CLASSES := $(shell echo $(CLASS) | tr ',' ' ') 

$(foreach CLASS_SPLIT, $(CLASSES), $(eval $(BUILD_CLASS))) 
+0

Он не работает в полной мере пока (возможно, из-за ошибок с моей стороны), но достаточно, чтобы продолжить. Спасибо! –

+1

О, добавление к нему: Малый надзор в коде выше, должно быть: ../classCvt/classCvt <./ Применения/$ (CLASS_SPLIT) .class> ./Applications/$(CLASS_SPLIT).ujc вместо от ../classCvt/classCvt <./ Приложения/$ (CLASS_SPLIT) .class> ./Applications/$(CLASS).ujc –

0

Простой способ:

pc: $(APP) 
    $(foreach C, $(shell echo $(CLASS) | tr ',' ' '), \ 
    make -C BUILDENV CLASS=$(C) BUILD=just_filelist OUTPUT=filelist.txt SKIPSELF=yes && \ 
    ../classCvt/classCvt <./Applications/$(C).class> ./Applications/$(C).ujc && \ 
    time -p ./$(APP) ./Applications/$(C).ujc `cat filelist.txt` &&) true 
Смежные вопросы