+/* $Id: RtemsMakefileVisitor.java 1 2010-02-24 13:03:05Z haidw $ */
+package dol.visitor.rtems;
+
+import java.io.FileOutputStream;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.util.Vector;
+
+import dol.datamodel.architecture.Architecture;
+import dol.datamodel.mapping.Mapping;
+import dol.datamodel.pn.Process;
+import dol.datamodel.pn.ProcessNetwork;
+import dol.datamodel.pn.Configuration;
+import dol.main.UserInterface;
+import dol.parser.xml.archischema.ArchiXmlParser;
+import dol.parser.xml.mapschema.MapXmlParser;
+import dol.visitor.PNVisitor;
+
+/**
+ * This class is a class for a visitor that is used to generate
+ * a RTEMS package Makefile.
+ */
+public class RtemsMakefileVisitor extends PNVisitor {
+
+ /**
+ * Constructor.
+ *
+ * @param dir path of the Makefile
+ */
+ public RtemsMakefileVisitor(String dir) {
+ _dir = dir;
+ }
+
+ /**
+ * Create a Makefile for the given process network.
+ *
+ * @param pn process network
+ */
+ public void visitComponent(ProcessNetwork pn) {
+ try {
+ String filename = _dir + _delimiter + "Makefile";
+ OutputStream file = new FileOutputStream(filename);
+ PrintStream ps = new PrintStream(file);
+
+ _ui = UserInterface.getInstance();
+ if (_ui.getRtemsBSP().equals("pc386")) {
+ ps.println(getPc386Makefile(pn));
+ } else if (_ui.getRtemsBSP().equals("mparm")) {
+ ps.println(getMparmMakefile(pn));
+ }
+ } catch (Exception e) {
+ System.out.println("RtemsMakefileVisitor: exception occured: "
+ + e.getMessage());
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * Create a makefile for the pc386 board support package.
+ *
+ * @param pn process network
+ * @return makefile for pc386 board support package
+ */
+ protected String getMparmMakefile(ProcessNetwork pn) {
+ String makefile = "";
+ String newline = System.getProperty("line.separator");
+ makefile += "ifndef SWARMDIR" + newline;
+ makefile += " $(error Fatal error: Undefined SWARMDIR "
+ + "environment variable!)" + newline;
+ makefile += "endif" + newline;
+ makefile += "" + newline;
+ makefile += "ifndef RTEMS_MAKEFILE_PATH" + newline;
+ makefile += " $(error Fatal error: Undefined "
+ + "RTEMS_MAKEFILE_PATH environment variable!)" + newline;
+ makefile += "endif" + newline;
+ makefile += "" + newline;
+ makefile += "ifdef EXENAME" + newline;
+ makefile += " EXEC=$(EXENAME).exe" + newline;
+ makefile += "else" + newline;
+ makefile += " EXEC=app.exe" + newline;
+ makefile += "endif" + newline;
+ makefile += "" + newline;
+ makefile += "PGM=${ARCH}/$(EXEC)" + newline;
+ makefile += "" + newline;
+ makefile += "# optional managers required" + newline;
+ makefile += "MANAGERS=io mp msg signal event region partition";
+ makefile += newline + newline;
+
+ if (_ui.getRtemsBSP().equals("mparm")) {
+ makefile += "# scratchpad queue lib" + newline;
+ makefile += "QUEUELIB=que_lib/lib" + newline;
+ makefile += "SS_SEMAPHORE_LIB_PATH = "
+ + "${QUEUELIB}/ss_semaphore_lib" + newline;
+ makefile +="SCRATCH_QUEUE_LIB_PATH = "
+ + "${QUEUELIB}/scratch_queue_lib" + newline;
+ makefile += "SCRATCH_SEMAPHORE_LIB_PATH = "
+ + "${QUEUELIB}/scratch_semaphore_lib" + newline;
+ makefile += "EXT_INT_LIB_PATH = ${QUEUELIB}/ext_int_lib" + newline;
+ }
+
+ makefile += "" + newline;
+ makefile += "#H_files" + newline;
+ makefile += "H_FILES=buffer_test_io.h" + newline;
+
+ if (_ui.getRtemsBSP().equals("mparm")) {
+ makefile += "H_FILES += system.h tmacros.h" + newline;
+ makefile += newline;
+ makefile += "COMMON_FLAGS += -DMPARM" + newline;
+ makefile += "COMMON_FLAGS += -I$(QUEUELIB)" + newline;
+ makefile += "COMMON_FLAGS += -I$(SS_SEMAPHORE_LIB_PATH)"
+ + newline;
+ makefile += "COMMON_FLAGS += -I$(SCRATCH_QUEUE_LIB_PATH)"
+ + newline;
+ makefile += "COMMON_FLAGS += -I$(SCRATCH_SEMAPHORE_LIB_PATH)";
+ makefile += newline;
+ makefile += newline;
+ makefile += "# communication options" + newline;
+ makefile += "COMMON_FLAGS += -DMPARM_SCRATCHPAD_QUEUE"
+ + newline;
+ makefile+="COMMON_FLAGS += -DQUEUE_BUFF_IN_PRODUCER "
+ + "-Dshaper_PROCESSOR" + newline;
+ makefile+="#COMMON_FLAGS += -DQUEUE_BUFF_IN_PRODUCER_DMA "
+ + "-Dshaper_PROCESSOR" + newline;
+ makefile+="#COMMON_FLAGS += -DQUEUE_BUFF_IN_CONSUMER "
+ + "-Dshaper_PROCESSOR" + newline;
+ makefile+="#COMMON_FLAGS += -DQUEUE_BUFF_IN_CONSUMER_DMA "
+ + "-Dshaper_PROCESSOR" + newline;
+ makefile+="#COMMON_FLAGS += -DQUEUE_BUFF_IN_SHARDMEM "
+ + "-Dshaper_PROCESSOR" + newline;
+
+ int shaperProcessorID;
+ if (_ui.getMappingFileName() == null) {
+ shaperProcessorID = pn.getProcessList().size();
+ } else {
+ ArchiXmlParser archParser = new ArchiXmlParser();
+ Architecture arch = archParser.
+ doParse(_ui.getPlatformFileName());
+ MapXmlParser mappingParser = new MapXmlParser(pn, arch);
+ Mapping mapping = mappingParser.
+ doParse(_ui.getMappingFileName());
+ shaperProcessorID = mapping.getProcessorList().size();
+ }
+ makefile +="#COMMON_FLAGS += -DQUEUE_BUFF_SHAPER "
+ + "-Dshaper_PROCESSOR=" + shaperProcessorID + newline;
+
+ makefile += newline;
+ makefile += "LIBFILECXX = "
+ + "$(SS_SEMAPHORE_LIB_PATH)/ss_semaphore.cpp "
+ + "$(SCRATCH_QUEUE_LIB_PATH)/scratch_queue.cpp"
+ + newline;
+ makefile += "VPATH = SCRATCH_QUEUE_LIB_PATH" + newline;
+ }
+
+ makefile += "" + newline;
+ makefile += "# C source names" + newline;
+ if (_ui.getRtemsBSP().equals("pc386")) {
+ makefile += "CSRCS = main.c rtems_process_wrapper.c ";
+ for (String basename : pn.getProcessBasenames()) {
+ makefile += basename + "_wrapper.c ";
+ }
+ }
+ makefile += newline;
+ makefile += "COBJS_ = $(CSRCS:.c=.o)" + newline;
+ makefile += "COBJS = $(COBJS_:%=%)" + newline;
+ makefile += "" + newline;
+ makefile += "# C++ source names" + newline;
+ makefile += "CXXSRCS = appsupport.c" + newline;
+
+ if (_ui.getRtemsBSP().equals("mparm")) {
+ makefile += "CXXSRCS += main.c traffic_shaping.c "
+ + "rtems_process_wrapper.c ";
+ Vector<String> pList = new Vector<String>();
+ for (Process p : pn.getProcessList()) {
+ String basename = p.getBasename();
+ if (!pList.contains(basename)) {
+ makefile += p.getBasename() + "_wrapper.c ";
+ pList.add(basename);
+ }
+ }
+ makefile += newline;
+ makefile += "CXXSRCS += $(LIBFILECXX)" + newline;
+ }
+
+ makefile += newline;
+ makefile += newline;
+ makefile += "CXXOBJS_ = $(CXXSRCS:.cpp=.o)" + newline;
+ makefile += "CXXOBJS = $(CXXOBJS_:%=%)" + newline;
+ makefile += "" + newline;
+ makefile += "# AS source names" + newline;
+ makefile += "ASSRCS =" + newline;
+ makefile += "ASOBJS_ = $(ASSRCS:.s=.o)" + newline;
+ makefile += "ASOBJS = $(ASOBJS_:%=%)" + newline;
+ makefile += "" + newline;
+ makefile += "# Libraries" + newline;
+ makefile += "LIBS = -lrtemsall -lc" + newline;
+ makefile += "" + newline;
+ makefile += "include $(RTEMS_MAKEFILE_PATH)/Makefile.inc"
+ + newline;
+ makefile += "include $(RTEMS_CUSTOM)" + newline;
+ makefile += "include $(PROJECT_ROOT)/make/leaf.cfg" + newline;
+ makefile += "" + newline;
+ makefile += "#CXXFLAGS += -DAUTOSTARTMEASURING" + newline;
+ makefile += "#CXXFLAGS += -DVERBOSE" + newline;
+ makefile += "CXXFLAGS += -I$(SWARMDIR)/core" + newline;
+ makefile += "CFLAGS += -I$(SWARMDIR)/core" + newline;
+
+ if (_ui.getRtemsBSP().equals("mparm")) {
+ makefile += "CXXFLAGS += $(COMMON_FLAGS) -I${PWD}" + newline;
+ makefile += "CFLAGS += $(COMMON_FLAGS) -I${PWD}" + newline;
+
+ makefile += newline;
+ makefile += "#### for calibration" + newline;
+ makefile += "CXXFLAGS += -Ilib" + newline;
+ makefile += "CXXFLAGS += -D_GLIBCPP_HAVE_WCHAR_H "
+ + "-D_GLIBCPP_HAVE_MBSTATE_T" + newline;
+ makefile += "CXXFLAGS += -DWORKLOAD_EXTRACT" + newline;
+ makefile += "CXXFLAGS += -DPRINTF_TO_DEBUG" + newline;
+ }
+ makefile += "" + newline;
+ makefile += "SRCS=$(H_FILES)" + newline;
+ makefile += "OBJS= $(COBJS) $(CXXOBJS) $(ASOBJS)" + newline;
+ makefile += "" + newline;
+ makefile += "all: ${ARCH} $(SRCS) $(PGM) " + newline;
+ makefile += "" + newline;
+ makefile += "$(PGM): $(OBJS) " + newline;
+ makefile += "\t$(make-exe)" + newline;
+ makefile += "clean:" + newline;
+ makefile += "\t-rm -f ${SS_SEMAPHORE_LIB_PATH}/*.o " +
+ "${SCRATCH_QUEUE_LIB_PATH}/*.o" + newline;
+
+ return makefile;
+ }
+
+ /**
+ * Create a makefile for the pc386 board support package.
+ *
+ * @param pn process network
+ * @return makefile for pc386 board support package
+ */
+ protected String getPc386Makefile(ProcessNetwork pn) {
+ String makefile = "";
+ String newline = System.getProperty("line.separator");
+ makefile += "EXEC=main.exe" + newline;
+ makefile += "PGM=${ARCH}/$(EXEC)" + newline;
+ makefile += newline;
+ makefile += "# optional managers required" + newline;
+ makefile += "MANAGERS=all" + newline;
+ makefile += newline;
+ makefile += "# C source names" + newline;
+ makefile += "CSRCS = main.c rtems_process_wrapper.c ";
+ for (String basename : pn.getProcessBasenames()) {
+ makefile += basename + "_wrapper.c ";
+ }
+ for (Configuration conf : pn.getCfgList()) {
+ if (conf.getName().equals("EXTERNAL_SRC")) {
+ makefile += conf.getValue();
+ }
+ }
+ makefile += newline;
+ makefile += "COBJS_ = $(CSRCS:.c=.o)" + newline;
+ makefile += "COBJS = $(COBJS_:%=${ARCH}/%)" + newline;
+ makefile += newline;
+ makefile += "# C++ source names" + newline;
+ makefile += "CXXSRCS =" + newline;
+ makefile += "CXXOBJS_ = $(CXXSRCS:.cc=.o)" + newline;
+ makefile += "CXXOBJS = $(CXXOBJS_:%=${ARCH}/%)" + newline;
+ makefile += newline;
+ makefile += "# AS source names" + newline;
+ makefile += "ASSRCS =" + newline;
+ makefile += "ASOBJS_ = $(ASSRCS:.s=.o)" + newline;
+ makefile += "ASOBJS = $(ASOBJS_:%=${ARCH}/%)" + newline;
+ makefile += newline;
+ makefile += "# Libraries" + newline;
+ makefile += "LIBS = -lrtemsall -lc ";
+ for (Configuration conf : pn.getCfgList()) {
+ if (conf.getName().equals("DYNAMIC_LINK"))
+ makefile += conf.getValue() + newline;
+ }
+ makefile += newline;
+ makefile += "include $(RTEMS_MAKEFILE_PATH)/Makefile.inc"
+ + newline;
+ makefile += newline;
+ makefile += "include $(RTEMS_CUSTOM)" + newline;
+ makefile += "include $(PROJECT_ROOT)/make/leaf.cfg" + newline;
+ makefile += newline;
+ makefile += "OBJS= $(COBJS) $(CXXOBJS) $(ASOBJS)" + newline;
+ makefile += newline;
+ makefile += "all: ${ARCH} $(PGM)" + newline;
+ makefile += newline;
+ makefile += "$(PGM): $(OBJS)" + newline;
+ makefile += "\t$(make-exe)" + newline;
+ return makefile;
+ }
+
+ protected String _dir = null;
+}