xref: /btstack/tool/btstack_code_template.py (revision 45d8a16ab764f7614799626ef6e9b7bebed3d95d)
1*45d8a16aSMatthias Ringwald#!/usr/bin/env python3
2*45d8a16aSMatthias Ringwald
3*45d8a16aSMatthias Ringwaldimport glob
4*45d8a16aSMatthias Ringwaldimport re
5*45d8a16aSMatthias Ringwaldimport sys
6*45d8a16aSMatthias Ringwaldimport os
7*45d8a16aSMatthias Ringwaldimport datetime
8*45d8a16aSMatthias Ringwaldfrom pathlib import Path
9*45d8a16aSMatthias Ringwald
10*45d8a16aSMatthias Ringwaldprogram_info = '''
11*45d8a16aSMatthias RingwaldGenerate .h and .c with BTstack copyright header in BTstack tree
12*45d8a16aSMatthias Ringwald
13*45d8a16aSMatthias RingwaldUsage: tool/btstack_code_template.py path/filename (without extension)
14*45d8a16aSMatthias Ringwald'''
15*45d8a16aSMatthias Ringwald
16*45d8a16aSMatthias Ringwaldcopyright = """/*
17*45d8a16aSMatthias Ringwald * Copyright (C) {copyright_year} BlueKitchen GmbH
18*45d8a16aSMatthias Ringwald *
19*45d8a16aSMatthias Ringwald * Redistribution and use in source and binary forms, with or without
20*45d8a16aSMatthias Ringwald * modification, are permitted provided that the following conditions
21*45d8a16aSMatthias Ringwald * are met:
22*45d8a16aSMatthias Ringwald *
23*45d8a16aSMatthias Ringwald * 1. Redistributions of source code must retain the above copyright
24*45d8a16aSMatthias Ringwald *    notice, this list of conditions and the following disclaimer.
25*45d8a16aSMatthias Ringwald * 2. Redistributions in binary form must reproduce the above copyright
26*45d8a16aSMatthias Ringwald *    notice, this list of conditions and the following disclaimer in the
27*45d8a16aSMatthias Ringwald *    documentation and/or other materials provided with the distribution.
28*45d8a16aSMatthias Ringwald * 3. Neither the name of the copyright holders nor the names of
29*45d8a16aSMatthias Ringwald *    contributors may be used to endorse or promote products derived
30*45d8a16aSMatthias Ringwald *    from this software without specific prior written permission.
31*45d8a16aSMatthias Ringwald * 4. Any redistribution, use, or modification is done solely for
32*45d8a16aSMatthias Ringwald *    personal benefit and not for any commercial purpose or for
33*45d8a16aSMatthias Ringwald *    monetary gain.
34*45d8a16aSMatthias Ringwald *
35*45d8a16aSMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS
36*45d8a16aSMatthias Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
37*45d8a16aSMatthias Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
38*45d8a16aSMatthias Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BLUEKITCHEN
39*45d8a16aSMatthias Ringwald * GMBH OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
40*45d8a16aSMatthias Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
41*45d8a16aSMatthias Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
42*45d8a16aSMatthias Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
43*45d8a16aSMatthias Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
44*45d8a16aSMatthias Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
45*45d8a16aSMatthias Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
46*45d8a16aSMatthias Ringwald * SUCH DAMAGE.
47*45d8a16aSMatthias Ringwald *
48*45d8a16aSMatthias Ringwald * Please inquire about commercial licensing options at
49*45d8a16aSMatthias Ringwald * [email protected]
50*45d8a16aSMatthias Ringwald *
51*45d8a16aSMatthias Ringwald */
52*45d8a16aSMatthias Ringwald"""
53*45d8a16aSMatthias Ringwald
54*45d8a16aSMatthias Ringwaldinclude_template = '''
55*45d8a16aSMatthias Ringwald/**
56*45d8a16aSMatthias Ringwald *  @brief TODO
57*45d8a16aSMatthias Ringwald */
58*45d8a16aSMatthias Ringwald
59*45d8a16aSMatthias Ringwald#ifndef {include_guard}
60*45d8a16aSMatthias Ringwald#define {include_guard}
61*45d8a16aSMatthias Ringwald
62*45d8a16aSMatthias Ringwald#if defined __cplusplus
63*45d8a16aSMatthias Ringwaldextern "C" {{
64*45d8a16aSMatthias Ringwald#endif
65*45d8a16aSMatthias Ringwald
66*45d8a16aSMatthias Ringwald#if defined __cplusplus
67*45d8a16aSMatthias Ringwald}}
68*45d8a16aSMatthias Ringwald#endif
69*45d8a16aSMatthias Ringwald#endif // {include_guard}
70*45d8a16aSMatthias Ringwald'''
71*45d8a16aSMatthias Ringwald
72*45d8a16aSMatthias Ringwaldsource_template = '''
73*45d8a16aSMatthias Ringwald#define BTSTACK_FILE__ "{btstack_file}"
74*45d8a16aSMatthias Ringwald
75*45d8a16aSMatthias Ringwald#include "{header_file}"
76*45d8a16aSMatthias Ringwald
77*45d8a16aSMatthias Ringwald#include "btstack_bool.h"
78*45d8a16aSMatthias Ringwald#include "btstack_config.h"
79*45d8a16aSMatthias Ringwald#include "btstack_debug.h"
80*45d8a16aSMatthias Ringwald
81*45d8a16aSMatthias Ringwald#include <stdint.h>
82*45d8a16aSMatthias Ringwald'''
83*45d8a16aSMatthias Ringwald
84*45d8a16aSMatthias Ringwaldbtstack_root = os.path.abspath(os.path.dirname(sys.argv[0]) + '/..')
85*45d8a16aSMatthias Ringwald
86*45d8a16aSMatthias Ringwaldif len(sys.argv) == 1:
87*45d8a16aSMatthias Ringwald	print(program_info)
88*45d8a16aSMatthias Ringwald	sys.exit(0)
89*45d8a16aSMatthias Ringwald
90*45d8a16aSMatthias Ringwaldpath = sys.argv[1]
91*45d8a16aSMatthias Ringwaldpath_object = Path(path)
92*45d8a16aSMatthias Ringwald
93*45d8a16aSMatthias Ringwald# include file
94*45d8a16aSMatthias Ringwaldpath_include = path + '.h'
95*45d8a16aSMatthias Ringwaldcopyright_year = datetime.datetime.now().year
96*45d8a16aSMatthias Ringwaldinclude_guard = path_object.name.replace('/','_').upper()+'_H'
97*45d8a16aSMatthias Ringwaldwith open(btstack_root + '/' + path_include, 'wt') as fout:
98*45d8a16aSMatthias Ringwald    fout.write(copyright.format(copyright_year=copyright_year))
99*45d8a16aSMatthias Ringwald    fout.write(include_template.format(include_guard=include_guard))
100*45d8a16aSMatthias Ringwald
101*45d8a16aSMatthias Ringwald# source file
102*45d8a16aSMatthias Ringwaldpath_source  = path + ".c"
103*45d8a16aSMatthias Ringwaldbtstack_file = path_object.name + '.c'
104*45d8a16aSMatthias Ringwaldif path_include.startswith('src/'):
105*45d8a16aSMatthias Ringwald	# keep path for src/ folder
106*45d8a16aSMatthias Ringwald	header_file = path_include.replace('src/','')
107*45d8a16aSMatthias Ringwaldelse:
108*45d8a16aSMatthias Ringwald	# only use filename for everything else
109*45d8a16aSMatthias Ringwald	header_file = Path(path).name + '.h'
110*45d8a16aSMatthias Ringwaldwith open(btstack_root + '/' + path_source, 'wt') as fout:
111*45d8a16aSMatthias Ringwald    fout.write(copyright.format(copyright_year=copyright_year))
112*45d8a16aSMatthias Ringwald    fout.write(source_template.format(btstack_file=btstack_file,header_file=header_file))
113*45d8a16aSMatthias Ringwald
114*45d8a16aSMatthias Ringwaldprint("Generated {file}.h and {file}.c in {path}".format(file=path_object.name,path=str(path_object.parent)))
115