1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163
|
#!/usr/bin/env python3
#
# Copyright (c) 2021 Raspberry Pi (Trading) Ltd.
#
# SPDX-License-Identifier: BSD-3-Clause
#
#
# Little script to build a header file including every other header file in the SDK!
# (also checks we don't have "conflicting" header-filenames)
# Edit the IGNORE_DIRS variable to filter out which directories get looked in.
#
# Usage:
#
# tools/build_all_headers.py <root of source tree> <output file>
import os
import sys
IGNORE_DIRS = set(['host', 'boards'])
IGNORE_DIRS.add('common/boot_picoboot')
IGNORE_DIRS.add('common/boot_uf2')
IGNORE_DIRS.add('common/pico_usb_reset_interface')
IGNORE_DIRS.add('rp2_common/cmsis')
IGNORE_DIRS.add('rp2_common/pico_async_context')
IGNORE_DIRS.add('rp2_common/pico_btstack')
#IGNORE_DIRS.add('rp2_common/pico_cyw43_arch')
IGNORE_DIRS.add('rp2_common/pico_cyw43_driver')
IGNORE_DIRS.add('rp2_common/pico_lwip')
IGNORE_DIRS.add('rp2_common/pico_stdio_semihosting')
IGNORE_DIRS.add('rp2_common/pico_stdio_usb')
IGNORE_DIRS.add('rp2_common/pico_clib_interface')
IGNORE_DIRS.add('rp2_common/pico_mbedtls')
SORT_HEADERS_BY_DIRECTORY = True # if False, sort by filename
if len(sys.argv) != 3:
print("Usage: {} top_dir output_header".format(os.path.basename(sys.argv[0])))
sys.exit(1)
top_dir = os.path.join(sys.argv[1], 'src')
output_header = sys.argv[2]
if not os.path.isdir(top_dir):
print("{} doesn't exist!".format(top_dir))
sys.exit(1)
include_dirs = set()
for root, dirs, files in os.walk(top_dir):
prune_dirs = []
for d in dirs:
if os.path.relpath(os.path.join(root, d), top_dir) in IGNORE_DIRS:
prune_dirs.append(d)
for d in prune_dirs:
dirs.remove(d)
if 'include' in dirs:
include_dirs.add(os.path.join(root, 'include'))
dirs.remove('include')
include_files_by_chip = {
'none': list(),
'rp2040': list(),
'rp2350': list(),
}
all_include_files = set()
include_locations = dict()
for d in sorted(include_dirs):
for root, dirs, files in os.walk(d):
for f in sorted(files):
if f.endswith('.h'):
include_file = os.path.relpath(os.path.join(root, f), d)
include_path = os.path.relpath(d, top_dir)
if 'rp2040/' in include_path:
include_files_by_chip['rp2040'].append(include_file)
elif 'rp2350/' in include_path:
include_files_by_chip['rp2350'].append(include_file)
else:
if include_file in include_files_by_chip['none']:
raise Exception("Duplicate include file '{}' (found in both {} and {})".format(include_file, include_locations[include_file], include_path))
include_files_by_chip['none'].append(include_file)
include_locations[include_file] = include_path
all_include_files.add(include_file)
# figure out which includes are applicable to both chips
include_files_by_chip['both'] = []
for f in include_files_by_chip['rp2040']:
if f in include_files_by_chip['rp2350']:
include_files_by_chip['both'].append(f)
include_locations[f] = include_locations[f].replace('rp2350/', 'rp2xxx/')
for f in include_files_by_chip['both']:
include_files_by_chip['rp2040'].remove(f)
include_files_by_chip['rp2350'].remove(f)
if SORT_HEADERS_BY_DIRECTORY:
with open(output_header, 'w') as fh:
fh.write('''/*
* Copyright (c) 2021 Raspberry Pi (Trading) Ltd.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
// This file is autogenerated, do not edit by hand
''')
last_location = ''
for f in include_files_by_chip['none']:
if include_locations[f] != last_location:
fh.write('\n// {}\n'.format(include_locations[f]))
fh.write('#include "{}"\n'.format(f))
last_location = include_locations[f]
for f in include_files_by_chip['both']:
if include_locations[f] != last_location:
fh.write('\n// {}\n'.format(include_locations[f]))
fh.write('#include "{}"\n'.format(f))
last_location = include_locations[f]
if include_files_by_chip['rp2040']:
fh.write('\n#if PICO_RP2040\n')
for f in include_files_by_chip['rp2040']:
if include_locations[f] != last_location:
fh.write('\n// {}\n'.format(include_locations[f]))
fh.write('#include "{}"\n'.format(f))
last_location = include_locations[f]
fh.write('\n#endif\n')
if include_files_by_chip['rp2350']:
fh.write('\n#if PICO_RP2350\n')
for f in include_files_by_chip['rp2350']:
if include_locations[f] != last_location:
fh.write('\n// {}\n'.format(include_locations[f]))
fh.write('#include "{}"\n'.format(f))
last_location = include_locations[f]
fh.write('\n#endif\n')
fh.write('\n')
else:
with open(output_header, 'w') as fh:
fh.write('''/*
* Copyright (c) 2021 Raspberry Pi (Trading) Ltd.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
// This file is autogenerated, do not edit by hand
''')
last_define = None
for f in sorted(all_include_files, key=lambda x: os.path.split(x)):
if f in include_files_by_chip['rp2040']:
define = 'PICO_RP2040'
elif f in include_files_by_chip['rp2350']:
define = 'PICO_RP2350'
else:
define = None
if define != last_define:
if last_define is not None:
fh.write('#endif\n')
if define is not None:
fh.write('#if {}\n'.format(define))
fh.write('#include "{}"\n'.format(f))
last_define = define
if last_define is not None:
fh.write('#endif\n')
fh.write('\n')
|