1 /* $Id: RtemsMakefileVisitor.java 1 2010-02-24 13:03:05Z haidw $ */
2 package dol.visitor.rtems;
4 import java.io.FileOutputStream;
5 import java.io.OutputStream;
6 import java.io.PrintStream;
7 import java.util.Vector;
9 import dol.datamodel.architecture.Architecture;
10 import dol.datamodel.mapping.Mapping;
11 import dol.datamodel.pn.Process;
12 import dol.datamodel.pn.ProcessNetwork;
13 import dol.datamodel.pn.Configuration;
14 import dol.main.UserInterface;
15 import dol.parser.xml.archischema.ArchiXmlParser;
16 import dol.parser.xml.mapschema.MapXmlParser;
17 import dol.visitor.PNVisitor;
20 * This class is a class for a visitor that is used to generate
21 * a RTEMS package Makefile.
23 public class RtemsMakefileVisitor extends PNVisitor {
28 * @param dir path of the Makefile
30 public RtemsMakefileVisitor(String dir) {
35 * Create a Makefile for the given process network.
37 * @param pn process network
39 public void visitComponent(ProcessNetwork pn) {
41 String filename = _dir + _delimiter + "Makefile";
42 OutputStream file = new FileOutputStream(filename);
43 PrintStream ps = new PrintStream(file);
45 _ui = UserInterface.getInstance();
46 if (_ui.getRtemsBSP().equals("pc386")) {
47 ps.println(getPc386Makefile(pn));
48 } else if (_ui.getRtemsBSP().equals("mparm")) {
49 ps.println(getMparmMakefile(pn));
51 } catch (Exception e) {
52 System.out.println("RtemsMakefileVisitor: exception occured: "
59 * Create a makefile for the pc386 board support package.
61 * @param pn process network
62 * @return makefile for pc386 board support package
64 protected String getMparmMakefile(ProcessNetwork pn) {
66 String newline = System.getProperty("line.separator");
67 makefile += "ifndef SWARMDIR" + newline;
68 makefile += " $(error Fatal error: Undefined SWARMDIR "
69 + "environment variable!)" + newline;
70 makefile += "endif" + newline;
71 makefile += "" + newline;
72 makefile += "ifndef RTEMS_MAKEFILE_PATH" + newline;
73 makefile += " $(error Fatal error: Undefined "
74 + "RTEMS_MAKEFILE_PATH environment variable!)" + newline;
75 makefile += "endif" + newline;
76 makefile += "" + newline;
77 makefile += "ifdef EXENAME" + newline;
78 makefile += " EXEC=$(EXENAME).exe" + newline;
79 makefile += "else" + newline;
80 makefile += " EXEC=app.exe" + newline;
81 makefile += "endif" + newline;
82 makefile += "" + newline;
83 makefile += "PGM=${ARCH}/$(EXEC)" + newline;
84 makefile += "" + newline;
85 makefile += "# optional managers required" + newline;
86 makefile += "MANAGERS=io mp msg signal event region partition";
87 makefile += newline + newline;
89 if (_ui.getRtemsBSP().equals("mparm")) {
90 makefile += "# scratchpad queue lib" + newline;
91 makefile += "QUEUELIB=que_lib/lib" + newline;
92 makefile += "SS_SEMAPHORE_LIB_PATH = "
93 + "${QUEUELIB}/ss_semaphore_lib" + newline;
94 makefile +="SCRATCH_QUEUE_LIB_PATH = "
95 + "${QUEUELIB}/scratch_queue_lib" + newline;
96 makefile += "SCRATCH_SEMAPHORE_LIB_PATH = "
97 + "${QUEUELIB}/scratch_semaphore_lib" + newline;
98 makefile += "EXT_INT_LIB_PATH = ${QUEUELIB}/ext_int_lib" + newline;
101 makefile += "" + newline;
102 makefile += "#H_files" + newline;
103 makefile += "H_FILES=buffer_test_io.h" + newline;
105 if (_ui.getRtemsBSP().equals("mparm")) {
106 makefile += "H_FILES += system.h tmacros.h" + newline;
108 makefile += "COMMON_FLAGS += -DMPARM" + newline;
109 makefile += "COMMON_FLAGS += -I$(QUEUELIB)" + newline;
110 makefile += "COMMON_FLAGS += -I$(SS_SEMAPHORE_LIB_PATH)"
112 makefile += "COMMON_FLAGS += -I$(SCRATCH_QUEUE_LIB_PATH)"
114 makefile += "COMMON_FLAGS += -I$(SCRATCH_SEMAPHORE_LIB_PATH)";
117 makefile += "# communication options" + newline;
118 makefile += "COMMON_FLAGS += -DMPARM_SCRATCHPAD_QUEUE"
120 makefile+="COMMON_FLAGS += -DQUEUE_BUFF_IN_PRODUCER "
121 + "-Dshaper_PROCESSOR" + newline;
122 makefile+="#COMMON_FLAGS += -DQUEUE_BUFF_IN_PRODUCER_DMA "
123 + "-Dshaper_PROCESSOR" + newline;
124 makefile+="#COMMON_FLAGS += -DQUEUE_BUFF_IN_CONSUMER "
125 + "-Dshaper_PROCESSOR" + newline;
126 makefile+="#COMMON_FLAGS += -DQUEUE_BUFF_IN_CONSUMER_DMA "
127 + "-Dshaper_PROCESSOR" + newline;
128 makefile+="#COMMON_FLAGS += -DQUEUE_BUFF_IN_SHARDMEM "
129 + "-Dshaper_PROCESSOR" + newline;
131 int shaperProcessorID;
132 if (_ui.getMappingFileName() == null) {
133 shaperProcessorID = pn.getProcessList().size();
135 ArchiXmlParser archParser = new ArchiXmlParser();
136 Architecture arch = archParser.
137 doParse(_ui.getPlatformFileName());
138 MapXmlParser mappingParser = new MapXmlParser(pn, arch);
139 Mapping mapping = mappingParser.
140 doParse(_ui.getMappingFileName());
141 shaperProcessorID = mapping.getProcessorList().size();
143 makefile +="#COMMON_FLAGS += -DQUEUE_BUFF_SHAPER "
144 + "-Dshaper_PROCESSOR=" + shaperProcessorID + newline;
147 makefile += "LIBFILECXX = "
148 + "$(SS_SEMAPHORE_LIB_PATH)/ss_semaphore.cpp "
149 + "$(SCRATCH_QUEUE_LIB_PATH)/scratch_queue.cpp"
151 makefile += "VPATH = SCRATCH_QUEUE_LIB_PATH" + newline;
154 makefile += "" + newline;
155 makefile += "# C source names" + newline;
156 if (_ui.getRtemsBSP().equals("pc386")) {
157 makefile += "CSRCS = main.c rtems_process_wrapper.c ";
158 for (String basename : pn.getProcessBasenames()) {
159 makefile += basename + "_wrapper.c ";
163 makefile += "COBJS_ = $(CSRCS:.c=.o)" + newline;
164 makefile += "COBJS = $(COBJS_:%=%)" + newline;
165 makefile += "" + newline;
166 makefile += "# C++ source names" + newline;
167 makefile += "CXXSRCS = appsupport.c" + newline;
169 if (_ui.getRtemsBSP().equals("mparm")) {
170 makefile += "CXXSRCS += main.c traffic_shaping.c "
171 + "rtems_process_wrapper.c ";
172 Vector<String> pList = new Vector<String>();
173 for (Process p : pn.getProcessList()) {
174 String basename = p.getBasename();
175 if (!pList.contains(basename)) {
176 makefile += p.getBasename() + "_wrapper.c ";
181 makefile += "CXXSRCS += $(LIBFILECXX)" + newline;
186 makefile += "CXXOBJS_ = $(CXXSRCS:.cpp=.o)" + newline;
187 makefile += "CXXOBJS = $(CXXOBJS_:%=%)" + newline;
188 makefile += "" + newline;
189 makefile += "# AS source names" + newline;
190 makefile += "ASSRCS =" + newline;
191 makefile += "ASOBJS_ = $(ASSRCS:.s=.o)" + newline;
192 makefile += "ASOBJS = $(ASOBJS_:%=%)" + newline;
193 makefile += "" + newline;
194 makefile += "# Libraries" + newline;
195 makefile += "LIBS = -lrtemsall -lc" + newline;
196 makefile += "" + newline;
197 makefile += "include $(RTEMS_MAKEFILE_PATH)/Makefile.inc"
199 makefile += "include $(RTEMS_CUSTOM)" + newline;
200 makefile += "include $(PROJECT_ROOT)/make/leaf.cfg" + newline;
201 makefile += "" + newline;
202 makefile += "#CXXFLAGS += -DAUTOSTARTMEASURING" + newline;
203 makefile += "#CXXFLAGS += -DVERBOSE" + newline;
204 makefile += "CXXFLAGS += -I$(SWARMDIR)/core" + newline;
205 makefile += "CFLAGS += -I$(SWARMDIR)/core" + newline;
207 if (_ui.getRtemsBSP().equals("mparm")) {
208 makefile += "CXXFLAGS += $(COMMON_FLAGS) -I${PWD}" + newline;
209 makefile += "CFLAGS += $(COMMON_FLAGS) -I${PWD}" + newline;
212 makefile += "#### for calibration" + newline;
213 makefile += "CXXFLAGS += -Ilib" + newline;
214 makefile += "CXXFLAGS += -D_GLIBCPP_HAVE_WCHAR_H "
215 + "-D_GLIBCPP_HAVE_MBSTATE_T" + newline;
216 makefile += "CXXFLAGS += -DWORKLOAD_EXTRACT" + newline;
217 makefile += "CXXFLAGS += -DPRINTF_TO_DEBUG" + newline;
219 makefile += "" + newline;
220 makefile += "SRCS=$(H_FILES)" + newline;
221 makefile += "OBJS= $(COBJS) $(CXXOBJS) $(ASOBJS)" + newline;
222 makefile += "" + newline;
223 makefile += "all: ${ARCH} $(SRCS) $(PGM) " + newline;
224 makefile += "" + newline;
225 makefile += "$(PGM): $(OBJS) " + newline;
226 makefile += "\t$(make-exe)" + newline;
227 makefile += "clean:" + newline;
228 makefile += "\t-rm -f ${SS_SEMAPHORE_LIB_PATH}/*.o " +
229 "${SCRATCH_QUEUE_LIB_PATH}/*.o" + newline;
235 * Create a makefile for the pc386 board support package.
237 * @param pn process network
238 * @return makefile for pc386 board support package
240 protected String getPc386Makefile(ProcessNetwork pn) {
241 String makefile = "";
242 String newline = System.getProperty("line.separator");
243 makefile += "EXEC=main.exe" + newline;
244 makefile += "PGM=${ARCH}/$(EXEC)" + newline;
246 makefile += "# optional managers required" + newline;
247 makefile += "MANAGERS=all" + newline;
249 makefile += "# C source names" + newline;
250 makefile += "CSRCS = main.c rtems_process_wrapper.c ";
251 for (String basename : pn.getProcessBasenames()) {
252 makefile += basename + "_wrapper.c ";
254 for (Configuration conf : pn.getCfgList()) {
255 if (conf.getName().equals("EXTERNAL_SRC")) {
256 makefile += conf.getValue();
260 makefile += "COBJS_ = $(CSRCS:.c=.o)" + newline;
261 makefile += "COBJS = $(COBJS_:%=${ARCH}/%)" + newline;
263 makefile += "# C++ source names" + newline;
264 makefile += "CXXSRCS =" + newline;
265 makefile += "CXXOBJS_ = $(CXXSRCS:.cc=.o)" + newline;
266 makefile += "CXXOBJS = $(CXXOBJS_:%=${ARCH}/%)" + newline;
268 makefile += "# AS source names" + newline;
269 makefile += "ASSRCS =" + newline;
270 makefile += "ASOBJS_ = $(ASSRCS:.s=.o)" + newline;
271 makefile += "ASOBJS = $(ASOBJS_:%=${ARCH}/%)" + newline;
273 makefile += "# Libraries" + newline;
274 makefile += "LIBS = -lrtemsall -lc ";
275 for (Configuration conf : pn.getCfgList()) {
276 if (conf.getName().equals("DYNAMIC_LINK"))
277 makefile += conf.getValue() + newline;
280 makefile += "include $(RTEMS_MAKEFILE_PATH)/Makefile.inc"
283 makefile += "include $(RTEMS_CUSTOM)" + newline;
284 makefile += "include $(PROJECT_ROOT)/make/leaf.cfg" + newline;
286 makefile += "OBJS= $(COBJS) $(CXXOBJS) $(ASOBJS)" + newline;
288 makefile += "all: ${ARCH} $(PGM)" + newline;
290 makefile += "$(PGM): $(OBJS)" + newline;
291 makefile += "\t$(make-exe)" + newline;
295 protected String _dir = null;