dol: initial dol commit
[jump.git] / dol / src / dol / visitor / rtems / RtemsMakefileVisitor.java
1 /* $Id: RtemsMakefileVisitor.java 1 2010-02-24 13:03:05Z haidw $ */
2 package dol.visitor.rtems;
3
4 import java.io.FileOutputStream;
5 import java.io.OutputStream;
6 import java.io.PrintStream;
7 import java.util.Vector;
8
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;
18
19 /**
20  *  This class is a class for a visitor that is used to generate
21  *  a RTEMS package Makefile.
22  */
23 public class RtemsMakefileVisitor extends PNVisitor {
24
25     /**
26      * Constructor.
27      *
28      * @param dir path of the Makefile
29      */
30     public RtemsMakefileVisitor(String dir) {
31         _dir = dir;
32     }
33
34     /**
35      * Create a Makefile for the given process network.
36      *
37      * @param pn process network
38      */
39     public void visitComponent(ProcessNetwork pn) {
40         try {
41             String filename = _dir + _delimiter + "Makefile";
42             OutputStream file = new FileOutputStream(filename);
43             PrintStream ps = new PrintStream(file);
44
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));
50             }
51         } catch (Exception e) {
52             System.out.println("RtemsMakefileVisitor: exception occured: "
53                     + e.getMessage());
54             e.printStackTrace();
55         }
56     }
57
58     /**
59      * Create a makefile for the pc386 board support package.
60      *
61      * @param pn process network
62      * @return makefile for pc386 board support package
63      */
64     protected String getMparmMakefile(ProcessNetwork pn) {
65         String makefile = "";
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;
88
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;
99         }
100
101         makefile += "" + newline;
102         makefile += "#H_files" + newline;
103         makefile += "H_FILES=buffer_test_io.h" + newline;
104
105         if (_ui.getRtemsBSP().equals("mparm")) {
106             makefile += "H_FILES += system.h tmacros.h" + newline;
107             makefile += newline;
108             makefile += "COMMON_FLAGS += -DMPARM" + newline;
109             makefile += "COMMON_FLAGS += -I$(QUEUELIB)" + newline;
110             makefile += "COMMON_FLAGS += -I$(SS_SEMAPHORE_LIB_PATH)"
111                    + newline;
112             makefile += "COMMON_FLAGS += -I$(SCRATCH_QUEUE_LIB_PATH)"
113                    + newline;
114             makefile += "COMMON_FLAGS += -I$(SCRATCH_SEMAPHORE_LIB_PATH)";
115             makefile += newline;
116             makefile += newline;
117             makefile += "# communication options" + newline;
118             makefile += "COMMON_FLAGS += -DMPARM_SCRATCHPAD_QUEUE"
119                     + newline;
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;
130
131         int shaperProcessorID;
132         if (_ui.getMappingFileName() == null) {
133         shaperProcessorID =  pn.getProcessList().size();
134         } else {
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();
142         }
143             makefile +="#COMMON_FLAGS += -DQUEUE_BUFF_SHAPER "
144                     + "-Dshaper_PROCESSOR=" + shaperProcessorID + newline;
145
146             makefile += newline;
147             makefile += "LIBFILECXX = "
148                    + "$(SS_SEMAPHORE_LIB_PATH)/ss_semaphore.cpp "
149                    + "$(SCRATCH_QUEUE_LIB_PATH)/scratch_queue.cpp"
150                    + newline;
151             makefile += "VPATH = SCRATCH_QUEUE_LIB_PATH" + newline;
152         }
153
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 ";
160             }
161         }
162         makefile += newline;
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;
168
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 ";
177                     pList.add(basename);
178                 }
179             }
180             makefile += newline;
181             makefile += "CXXSRCS += $(LIBFILECXX)" + newline;
182         }
183
184         makefile += newline;
185         makefile += 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"
198                 + newline;
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;
206
207         if (_ui.getRtemsBSP().equals("mparm")) {
208             makefile += "CXXFLAGS += $(COMMON_FLAGS) -I${PWD}" + newline;
209             makefile += "CFLAGS += $(COMMON_FLAGS) -I${PWD}" + newline;
210
211             makefile += 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;
218         }
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;
230
231         return makefile;
232     }
233
234     /**
235      * Create a makefile for the pc386 board support package.
236      *
237      * @param pn process network
238      * @return makefile for pc386 board support package
239      */
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;
245         makefile += newline;
246         makefile += "# optional managers required" + newline;
247         makefile += "MANAGERS=all" + newline;
248         makefile += 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 ";
253         }
254         for (Configuration conf : pn.getCfgList()) {
255             if (conf.getName().equals("EXTERNAL_SRC")) {
256                 makefile += conf.getValue();
257             }
258         }
259         makefile += newline;
260         makefile += "COBJS_ = $(CSRCS:.c=.o)" + newline;
261         makefile += "COBJS = $(COBJS_:%=${ARCH}/%)" + newline;
262         makefile += newline;
263         makefile += "# C++ source names" + newline;
264         makefile += "CXXSRCS =" + newline;
265         makefile += "CXXOBJS_ = $(CXXSRCS:.cc=.o)" + newline;
266         makefile += "CXXOBJS = $(CXXOBJS_:%=${ARCH}/%)" + newline;
267         makefile += newline;
268         makefile += "# AS source names" + newline;
269         makefile += "ASSRCS =" + newline;
270         makefile += "ASOBJS_ = $(ASSRCS:.s=.o)" + newline;
271         makefile += "ASOBJS = $(ASOBJS_:%=${ARCH}/%)" + newline;
272         makefile += 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;
278         }
279         makefile += newline;
280         makefile += "include $(RTEMS_MAKEFILE_PATH)/Makefile.inc"
281                 + newline;
282         makefile += newline;
283         makefile += "include $(RTEMS_CUSTOM)" + newline;
284         makefile += "include $(PROJECT_ROOT)/make/leaf.cfg" + newline;
285         makefile += newline;
286         makefile += "OBJS= $(COBJS) $(CXXOBJS) $(ASOBJS)" + newline;
287         makefile += newline;
288         makefile += "all:    ${ARCH} $(PGM)" + newline;
289         makefile += newline;
290         makefile += "$(PGM): $(OBJS)" + newline;
291         makefile += "\t$(make-exe)" + newline;
292         return makefile;
293     }
294
295     protected String _dir = null;
296 }