Permalink
Switch branches/tags
Nothing to show
Find file Copy path
1334de5 Jun 10, 2018
1 contributor

Users who have contributed to this file

executable file 159 lines (139 sloc) 4.11 KB
#!/usr/bin/python3 -B
# Copyright 2018 Josh Pieper, jjp@pobox.com.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Extract a sysroot suitable for cross compilation from a live
raspberry pi.
"""
import argparse
import datetime
import subprocess
import tempfile
def call(cmd, *args, **kwargs):
print("Running:", cmd)
subprocess.check_call(cmd, *args, **kwargs)
def main():
parser = argparse.ArgumentParser()
parser.add_argument('--user', '-u', help='username', default='pi')
parser.add_argument('--target', default='arm-linux-gnueabihf')
parser.add_argument('host', help='IP to use')
args = parser.parse_args()
temp_dir = tempfile.mkdtemp(prefix='make-sysroot-')
# These are the directories we want whole.
recursive_sources = [
'/usr/lib/gcc/{}'.format(args.target),
'/usr/include/{}/asm'.format(args.target),
'/usr/include/{}/bits'.format(args.target),
'/usr/include/{}/c++'.format(args.target),
'/usr/include/{}/gnu'.format(args.target),
'/usr/include/{}/sys'.format(args.target),
'/usr/include/arpa'.format(args.target),
'/usr/include/asm-generic',
'/usr/include/c++',
'/usr/include/linux',
'/usr/include/net',
'/usr/include/netinet',
'/usr/include/rpc',
'/usr/include/X11',
]
# And these individual files.
lib_file_sources = ['/lib/{}/{}'.format(args.target, x) for x in [
'libnss*',
'ld-*.so*',
'libc.so*',
'libdl*',
'libgcc_s.so*',
'libm-2*.so',
'libm.so*',
'libpthread-2*.so',
'libpthread.so*',
'librt-2*.so',
'librt.so*',
'libutil-2*',
'libutil.so*',
'libresolv*',
]]
usr_lib_file_sources = ['/usr/lib/{}/{}'.format(args.target, x) for x in [
'*.o',
'libc.a',
'libc_nonshared.a',
'libc.so',
'libdl.a',
'libdl.so',
'libm.a',
'libm.so',
'libpthread.a',
'libpthread_nonshared.a',
'libpthread.so',
'librt.so',
'librt.a',
'libutil.so',
'libutil.a',
'libresolv.a',
'libresolv.so',
]]
usr_include_file_sources = ['/usr/include/{}'.format(x) for x in [
'*.h',
]]
# Prepare our 'rsync' compatible formats for all filters.
include_patterns = (
['{}/***'.format(x) for x in recursive_sources] +
lib_file_sources +
usr_lib_file_sources +
usr_include_file_sources
)
# Excluding these directories is necessary for (a) time, and (b)
# they contain some files with either recursive symlinks or
# inaccessible files.
exclude_dirs = [
'bin',
'boot',
'dev',
'etc',
'home',
'lost+found',
'media',
'opt',
'proc',
'root',
'run',
'sbin',
'srv',
'sys',
'tmp',
'usr/share',
'usr/lib/ssl',
'var',
]
print(temp_dir)
call([
'rsync',
'-vrzLR',
'--prune-empty-dirs',
'--safe-links',
'--exclude=cc1',
'--exclude=cc1plus',
'--exclude=lto-wrapper',
'--exclude=lto1', ] + [
'--exclude=/{}'.format(x) for x in exclude_dirs ] +
['--include={}'.format(x) for x in include_patterns] + [
'--include=*/',
'--exclude=/***',
'{}@{}:/'.format(args.user, args.host),
temp_dir,
])
call("tar -c -C {} . | xz -9 > {}-sysroot.tar.xz".format(
temp_dir, datetime.date.today().isoformat()),
shell=True)
if __name__ == '__main__':
main()