В настоящее время я работаю над 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, а затем повторить его. Но нет подсказки, если это хороший способ и даже о том, как это сделать. Что вы предлагаете?
Он не работает в полной мере пока (возможно, из-за ошибок с моей стороны), но достаточно, чтобы продолжить. Спасибо! –
О, добавление к нему: Малый надзор в коде выше, должно быть: ../classCvt/classCvt <./ Применения/$ (CLASS_SPLIT) .class> ./Applications/$(CLASS_SPLIT).ujc вместо от ../classCvt/classCvt <./ Приложения/$ (CLASS_SPLIT) .class> ./Applications/$(CLASS).ujc –