source: rtems-libbsd/makefile.py @ c117a28

4.11
Last change on this file since c117a28 was 8440506, checked in by Chris Johns <chrisj@…>, on 06/15/15 at 07:42:23

Add tcpdump and libpcap.

  • Update the file builder generator to handle generator specific cflags and includes. The tcpdump and libpcap have localised headers and need specific headers paths to see them. There are also module specific flags and these need to be passed to the lex and yacc generators.
  • Add the tcpdump support.
  • Property mode set to 100755
File size: 15.9 KB
Line 
1#
2#  Copyright (c) 2015 Chris Johns <chrisj@rtems.org>. All rights reserved.
3#
4#  Copyright (c) 2009-2015 embedded brains GmbH.  All rights reserved.
5#
6#   embedded brains GmbH
7#   Dornierstr. 4
8#   82178 Puchheim
9#   Germany
10#   <info@embedded-brains.de>
11#
12#  Copyright (c) 2012 OAR Corporation. All rights reserved.
13#
14#  Redistribution and use in source and binary forms, with or without
15#  modification, are permitted provided that the following conditions
16#  are met:
17#  1. Redistributions of source code must retain the above copyright
18#     notice, this list of conditions and the following disclaimer.
19#  2. Redistributions in binary form must reproduce the above copyright
20#     notice, this list of conditions and the following disclaimer in the
21#     documentation and/or other materials provided with the distribution.
22#
23#  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24#  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25#  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
26#  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
27#  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
28#  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
29#  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
30#  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
31#  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32#  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
33#  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34
35import tempfile
36
37import builder
38
39class SourceFileFragmentComposer(builder.BuildSystemFragmentComposer):
40
41    def __init__(self, cflags = None, includes = None):
42        self.cflags = cflags
43        self.includes = includes
44
45    def compose(self, path):
46        fragment = 'LIB_C_FILES += ' + path + '\n'
47        cflags = ''
48        if self.includes != None:
49            if type(self.includes) is list:
50                cflags += ' '.join(self.includes)
51            else:
52                cflags += self.includes
53        if self.cflags != None:
54            if type(self.cflags) is list:
55                cflags += ' '.join(self.cflags)
56            else:
57                cflags += self.cflags
58        if len(cflags) > 0:
59            fragment = fragment + path[:-1] + 'o: ' + path + '\n' \
60                       + '\t$(CC) $(CPPFLAGS) $(CFLAGS) ' + cflags + ' -c $< -o $@\n'
61        return fragment
62
63class TestFragementComposer(builder.BuildSystemFragmentComposer):
64
65    def __init__(self, testName, fileFragments, runTest = True, netTest = False):
66        self.testName = testName
67        self.fileFragments = fileFragments
68        self.runTest = runTest
69        self.netTest = netTest
70
71    def compose(self, path):
72        makefileFragment = ''
73        testPrefix = 'TEST_' + self.testName.upper()
74        testOFiles = testPrefix + '_O_FILES'
75        testDFiles = testPrefix + '_D_FILES'
76        testDir = 'testsuite/' + self.testName
77        testExe = testDir + '/' + self.testName + '.exe'
78        testMap = testDir + '/' + self.testName + '.map'
79        testCollection = 'TESTS'
80        if self.netTest:
81            testCollection = 'NET_' + testCollection
82        makefileFragment += '\n' + testPrefix + ' = ' + testExe + '\n' \
83                           + testOFiles + ' =\n' \
84                           + testDFiles + ' =\n'
85        for fileFragment in self.fileFragments:
86            makefileFragment += testOFiles + ' += ' + testDir + '/' + fileFragment + '.o\n' \
87                               + testDFiles + ' += ' + testDir + '/' + fileFragment + '.d\n'
88        makefileFragment += '$(' + testPrefix + '): $(' + testOFiles + ') $(LIB)\n' \
89                            '\t$(LINK.c) -Wl,-Map,' + testMap + ' $^ -lm -lz -o $@\n' \
90                            + testCollection + ' += $(' + testPrefix + ')\n' \
91                            'O_FILES += $(' + testOFiles + ')\n' \
92                            'D_FILES += $(' + testDFiles + ')\n'
93        if self.runTest:
94            makefileFragment += 'RUN_' + testCollection + ' += $(' + testPrefix + ')\n'
95        return makefileFragment
96
97class KVMSymbolsFragmentComposer(builder.BuildSystemFragmentComposer):
98
99    def compose(self, path):
100        return 'LIB_GEN_FILES += ' + path + '\n' \
101            'LIB_C_FILES += ' + path + '\n' \
102            + path + ': rtemsbsd/rtems/generate_kvm_symbols\n' \
103            '\t./$< > $@\n'
104
105class RPCGENFragmentComposer(builder.BuildSystemFragmentComposer):
106
107    def compose(self, path):
108        headerPath = path[:-2] + '.h'
109        return headerPath + ': ' + path + '\n' \
110            '\t rm -f $@\n' \
111            '\t rpcgen -h -o $@ $<\n'
112
113class RouteKeywordsFragmentComposer(builder.BuildSystemFragmentComposer):
114
115    def compose(self, path):
116        headerPath = path + '.h'
117        tmpPath = path + '.tmp'
118        return headerPath + ': ' + path + '\n' \
119            '\tsed -e \'/^#/d\' -e \'/^$$/d\' $< > ' + tmpPath + '\n' \
120            '\tLC_ALL=C tr \'a-z\' \'A-Z\' < ' + tmpPath + ' | paste ' + tmpPath + ' - | \\\n' \
121            '\tawk \'{ if (NF > 1) printf "#define\\tK_%s\\t%d\\n\\t{\\"%s\\", K_%s},\\n", $$2, NR, $$1, $$2 }\' > $@\n' \
122            '\trm -f ' + tmpPath + '\n'
123
124class LexFragmentComposer(builder.BuildSystemFragmentComposer):
125
126    def __init__(self, sym, dep, cflags = None, includes = None):
127        self.sym = sym
128        self.dep = dep
129        self.cflags = ''
130        if cflags is not None:
131            self.cflags += ' '.join(cflags)
132        if includes is not None:
133            self.cflags += ' -I'.join(includes)
134
135    def compose(self, path):
136        src = path[:-2] + '.c'
137        dep = path[:path.rfind('/')] + '/' + self.dep
138        fragment = 'LIB_C_FILES += ' + src + '\n' \
139            + src + ': ' + path + ' ' + dep + '\n' \
140            '\t${LEX} -P ' + self.sym + ' -t $< | sed -e \'/YY_BUF_SIZE/s/16384/1024/\' > $@\n'
141        if len(self.cflags) > 0:
142            fragment = fragment + src[:-1] + 'o: ' + src + '\n' \
143                       + '\t$(CC) $(CPPFLAGS) $(CFLAGS) ' + self.cflags + ' -c $< -o $@\n'
144        return fragment
145
146class YaccFragmentComposer(builder.BuildSystemFragmentComposer):
147
148    def __init__(self, sym, header, cflags = None, includes = None):
149        self.sym = sym
150        self.header = header
151        self.cflags = ''
152        if cflags is not None:
153            self.cflags += ' '.join(cflags)
154        if includes is not None:
155            self.cflags += ' -I'.join(includes)
156
157    def compose(self, path):
158        src = path[:-2] + '.c'
159        hdr = path[:path.rfind('/')] + '/' + self.header
160        if self.sym is not None:
161            sym = '-b %s' % (self.sym)
162        else:
163            sym = os.path.basename(src)[:-2]
164        fragment = 'LIB_C_FILES += ' + src + '\n' \
165            + src + ': ' + path + '\n' \
166            '\tyacc -b ' + sym + ' -d -p ' + sym + ' $<\n' \
167            '\tsed -e ''/YY_BUF_SIZE/s/16384/1024/'' < ' + sym + '.tab.c > $@\n' \
168            '\trm -f ' + sym + '.tab.c\n' \
169            '\tmv ' + sym + '.tab.h ' + hdr + '\n'
170        if len(self.cflags) > 0:
171            fragment = fragment + src[:-1] + 'o: ' + src + '\n' \
172                       + '\t$(CC) $(CPPFLAGS) $(CFLAGS) ' + self.cflags + ' -c $< -o $@\n'
173        return fragment
174
175# Module Manager - Collection of Modules
176class ModuleManager(builder.ModuleManager):
177
178    def setGenerators(self):
179        self.generator['convert'] = builder.Converter
180        self.generator['no-convert'] = builder.NoConverter
181
182        self.generator['file'] = builder.File
183
184        self.generator['path'] = builder.PathComposer
185        self.generator['freebsd-path'] = builder.FreeBSDPathComposer
186        self.generator['rtems-path'] = builder.RTEMSPathComposer
187        self.generator['cpu-path'] = builder.CPUDependentPathComposer
188        self.generator['target-src-cpu--path'] = builder.TargetSourceCPUDependentPathComposer
189
190        self.generator['source'] = SourceFileFragmentComposer
191        self.generator['test'] = TestFragementComposer
192        self.generator['kvm-symbols'] = KVMSymbolsFragmentComposer
193        self.generator['rpc-gen'] = RPCGENFragmentComposer
194        self.generator['route-keywords'] = RouteKeywordsFragmentComposer
195        self.generator['lex'] = LexFragmentComposer
196        self.generator['yacc'] = YaccFragmentComposer
197
198    def generate(self):
199        data = 'include config.inc\n' \
200               '\n' \
201               'RTEMS_MAKEFILE_PATH = $(PREFIX)/$(TARGET)/$(BSP)\n' \
202               'include $(RTEMS_MAKEFILE_PATH)/Makefile.inc\n' \
203               'include $(RTEMS_CUSTOM)\n' \
204               'include $(PROJECT_ROOT)/make/leaf.cfg\n' \
205               '\n' \
206               'COMMON_FLAGS += -fno-strict-aliasing\n' \
207               'COMMON_FLAGS += -ffreestanding\n' \
208               'COMMON_FLAGS += -fno-common\n' \
209               'COMMON_FLAGS += -Irtemsbsd/include\n' \
210               'COMMON_FLAGS += -Irtemsbsd/$(RTEMS_CPU)/include\n' \
211               'COMMON_FLAGS += -Ifreebsd/sys\n' \
212               'COMMON_FLAGS += -Ifreebsd/sys/$(RTEMS_CPU)/include\n' \
213               'COMMON_FLAGS += -Ifreebsd/sys/contrib/altq\n' \
214               'COMMON_FLAGS += -Ifreebsd/sys/contrib/pf\n' \
215               'COMMON_FLAGS += -Ifreebsd/include\n' \
216               'COMMON_FLAGS += -Ifreebsd/lib/libc/include\n' \
217               'COMMON_FLAGS += -Ifreebsd/lib/libc/isc/include\n' \
218               'COMMON_FLAGS += -Ifreebsd/lib/libc/resolv\n' \
219               'COMMON_FLAGS += -Ifreebsd/lib/libutil\n' \
220               'COMMON_FLAGS += -Ifreebsd/lib/libkvm\n' \
221               'COMMON_FLAGS += -Ifreebsd/lib/libmemstat\n' \
222               'COMMON_FLAGS += -Ifreebsd/lib/libipsec\n' \
223               'COMMON_FLAGS += -Irtemsbsd/sys\n' \
224               'COMMON_FLAGS += -ImDNSResponder/mDNSCore\n' \
225               'COMMON_FLAGS += -ImDNSResponder/mDNSShared\n' \
226               'COMMON_FLAGS += -ImDNSResponder/mDNSPosix\n' \
227               'COMMON_FLAGS += -Itestsuite/include\n' \
228               'COMMON_FLAGS += -DHAVE_RTEMS_PCI_H=1\n' \
229               'COMMON_FLAGS += -Wall\n' \
230               'COMMON_FLAGS += -Wno-format\n' \
231               'COMMON_FLAGS += -MT $@ -MD -MP -MF $(basename $@).d\n' \
232               'CFLAGS += $(COMMON_FLAGS)\n' \
233               'CFLAGS += -std=gnu11\n' \
234               'CXXFLAGS += $(COMMON_FLAGS)\n' \
235               'CXXFLAGS += -std=gnu++11\n' \
236               'NEED_DUMMY_PIC_IRQ=yes\n' \
237               '\n' \
238               'TEST_NETWORK_CONFIG = testsuite/include/rtems/bsd/test/network-config.h\n' \
239               '\n' \
240               'TESTS =\n' \
241               'RUN_TESTS =\n' \
242               '\n' \
243               'NET_TESTS =\n' \
244               'RUN_NET_TESTS =\n' \
245               '\n' \
246               'O_FILES =\n' \
247               'D_FILES =\n' \
248               '\n' \
249               'LIB = libbsd.a\n' \
250               'LIB_GEN_FILES =\n' \
251               'LIB_C_FILES =\n' \
252               'LIB_CXX_FILES =\n' \
253               'LIB_CXX_FILES += rtemsbsd/rtems/rtems-bsd-cxx.cc\n'
254        for mn in self.getModules():
255            m = self[mn]
256            if m.conditionalOn != "none":
257                data += 'ifneq ($(' + m.conditionalOn + '),yes)\n'
258            for f in m.files:
259                data += f.getFragment()
260            for cpu, files in sorted(m.cpuDependentSourceFiles.items()):
261                data += 'ifeq ($(RTEMS_CPU), ' + cpu + ')\n'
262                for f in files:
263                    data += f.getFragment()
264                if cpu in ("arm", "i386", "lm32", "mips", "powerpc", "sparc", "m68k"):
265                    data += 'NEED_DUMMY_PIC_IRQ=no\n'
266                data += 'endif\n'
267                if m.conditionalOn != "none":
268                    data += 'endif # ' + m.conditionalOn +'\n'
269        data += '\n' \
270                'ifeq ($(NEED_DUMMY_PIC_IRQ),yes)\n' \
271                'CFLAGS += -I rtems-dummy-pic-irq/include\n' \
272                'endif\n' \
273                'LIB_O_FILES = $(LIB_C_FILES:%.c=%.o) $(LIB_CXX_FILES:%.cc=%.o)\n' \
274                'O_FILES += $(LIB_O_FILES)\n' \
275                'D_FILES += $(LIB_C_FILES:%.c=%.d) $(LIB_CXX_FILES:%.cc=%.d)\n' \
276                '\n' \
277                'all: $(LIB) $(TESTS) $(TEST_NETWORK_CONFIG) $(NET_TESTS)\n' \
278                '\n' \
279                '$(LIB): $(LIB_GEN_FILES) $(LIB_O_FILES)\n' \
280                '\trm -f $@\n' \
281                '\t$(AR) rcu $@ $^\n' \
282                '\n' \
283                'run_tests: $(RUN_TESTS)\n' \
284                '\t$(TEST_RUNNER) $^\n' \
285                '\tcheck_endof\n' \
286                '\n' \
287                'run_net_tests: $(RUN_NET_TESTS)\n' \
288                '\t$(TEST_RUNNER) -N -T $(NET_TAP_INTERFACE) $^\n' \
289                '\tcheck_endof\n' \
290                '\n' \
291                '$(TEST_NETWORK_CONFIG): $(TEST_NETWORK_CONFIG).in config.inc\n' \
292                '\tsed -e \'s/@NET_CFG_SELF_IP@/$(NET_CFG_SELF_IP)/\' \\\n' \
293                '\t-e \'s/@NET_CFG_NETMASK@/$(NET_CFG_NETMASK)/\' \\\n' \
294                '\t-e \'s/@NET_CFG_PEER_IP@/$(NET_CFG_PEER_IP)/\' \\\n' \
295                '\t-e \'s/@NET_CFG_GATEWAY_IP@/$(NET_CFG_GATEWAY_IP)/\' \\\n' \
296                '\t< $< > $@\n' \
297                '\n' \
298                'CPU_SED  = sed\n' \
299                'CPU_SED += -e \'/arm/d\'\n' \
300                'CPU_SED += -e \'/i386/d\'\n' \
301                'CPU_SED += -e \'/powerpc/d\'\n' \
302                'CPU_SED += -e \'/mips/d\'\n' \
303                'CPU_SED += -e \'/sparc64/d\'\n' \
304                '\n' \
305                'LIB_DIR = $(INSTALL_BASE)/lib\n' \
306                'INCLUDE_DIR = $(INSTALL_BASE)/lib/include\n' \
307                '\n' \
308                'install: $(LIB)\n' \
309                '\tinstall -d $(LIB_DIR)\n' \
310                '\tinstall -m 644 $(LIB) $(LIB_DIR)\n' \
311                '\tcd rtemsbsd/include ; for i in `find . -type d` ; do \\\n' \
312                '\t  install -d $(INCLUDE_DIR)/$$i ; \\\n' \
313                '\t  install -m 644 $$i/*.h $(INCLUDE_DIR)/$$i ; done\n' \
314                '\tinstall -d $(INCLUDE_DIR)/mghttpd\n' \
315                '\tinstall -m 644 rtemsbsd/mghttpd/mongoose.h $(INCLUDE_DIR)/mghttpd\n' \
316                '\tcd freebsd/include ; for i in `find . -type d` ; do \\\n' \
317                '\t  install -d $(INCLUDE_DIR)/$$i ; \\\n' \
318                '\t  install -m 644 $$i/*.h $(INCLUDE_DIR)/$$i ; done\n' \
319                '\tcd freebsd/sys/contrib/altq ; \\\n' \
320                '\t  install -d $(INCLUDE_DIR)/altq ; \\\n' \
321                '\t  install -m 644 altq/*.h $(INCLUDE_DIR)/altq\n' \
322                '\tfor i in bsm cam net net80211 netatalk netinet netinet6 netipsec sys vm ; do \\\n' \
323                '\t  install -d $(INCLUDE_DIR)/$$i ; \\\n' \
324                '\t  install -m 644 freebsd/sys/$$i/*.h $(INCLUDE_DIR)/$$i ; done\n' \
325                '\tcd freebsd/sys/dev/mii ; \\\n' \
326                '\t  install -d $(INCLUDE_DIR)/dev/mii ; \\\n' \
327                '\t  install -m 644 *.h $(INCLUDE_DIR)/dev/mii\n' \
328                '\tinstall -m 644 mDNSResponder/mDNSCore/mDNSDebug.h $(INCLUDE_DIR)\n' \
329                '\tinstall -m 644 mDNSResponder/mDNSCore/mDNSEmbeddedAPI.h $(INCLUDE_DIR)\n' \
330                '\tinstall -m 644 mDNSResponder/mDNSShared/dns_sd.h $(INCLUDE_DIR)\n' \
331                '\tinstall -m 644 mDNSResponder/mDNSPosix/mDNSPosix.h $(INCLUDE_DIR)\n' \
332                '\n' \
333                'clean:\n' \
334                '\trm -f $(LIB_GEN_FILES) $(LIB) $(TESTS) $(O_FILES) $(D_FILES)\n' \
335                '\trm -f libbsd.html\n' \
336                '\n' \
337                '-include $(D_FILES)\n' \
338                '\n' \
339                'doc: libbsd.html\n' \
340                '\n' \
341                'libbsd.html: libbsd.txt\n' \
342                '\tasciidoc -o libbsd.html libbsd.txt\n'
343        try:
344            out = tempfile.NamedTemporaryFile(delete = False)
345            out.write(data)
346            out.close()
347            makefile = builder.RTEMS_DIR + '/Makefile'
348            builder.processIfDifferent(out.name, makefile, "Makefile")
349        finally:
350            try:
351                os.remove(out.name)
352            except:
353                pass
Note: See TracBrowser for help on using the repository browser.