|
- #!/usr/bin/env python3
-
- import argparse
- import os
- import subprocess
- import glob
-
- def handle_cuda_libs(path):
- subprocess.check_call('rm -rf tmp && rm -rf tmp_sub', shell=True)
- print('\nhandle cuda file from.{}'.format(path))
- cmd = 'dpkg-deb -xv {} tmp'.format(path)
- subprocess.check_call(cmd, shell=True)
- sub_debs = glob.glob('tmp/**/*.deb', recursive=True)
- assert(len(sub_debs) > 0)
- for sub_deb in sub_debs:
- subprocess.check_call('rm -rf tmp_sub', shell=True)
- print('handle sub_deb: {}'.format(sub_deb))
- cmd = 'dpkg-deb -xv {} tmp_sub'.format(sub_deb)
- subprocess.check_call(cmd, shell=True)
- sub_sub_debs = glob.glob('tmp_sub/**/*.deb', recursive=True)
- assert(len(sub_sub_debs) == 0)
- if (os.path.isdir('tmp_sub/usr/share/')):
- subprocess.check_call('cp -v tmp_sub/usr/share/* output/ -rf', shell=True)
- if (os.path.isdir('tmp_sub/usr/local/')):
- subprocess.check_call('cp -v tmp_sub/usr/local/* output/ -rf', shell=True)
-
- def main():
- parser = argparse.ArgumentParser()
-
- parser.add_argument(
- "-s",
- "--sbsa_mode",
- action="store_true",
- help="create cuda sbsa libs, which means use to x86 cross build for aarch64 cuda libs",
- )
-
- parser.add_argument(
- "-t",
- "--target_aarch",
- type=str,
- choices=['x86-64', 'aarch64'],
- help="create libs build for, now support x86-64 and aarch64",
- dest="target_aarch",
- required=True,
- )
-
- parser.add_argument(
- "-d",
- "--cudnn_deb",
- help="cudnn deb package, download from: download from: https://developer.nvidia.com/cudnn-download-survey",
- dest="cudnn_deb",
- type=str,
- required=True,
- )
-
- parser.add_argument(
- "-r",
- "--trt_deb",
- help="trt deb package, download from: https://developer.nvidia.com/nvidia-tensorrt-download",
- dest="trt_deb",
- type=str,
- required=True,
- )
-
- parser.add_argument(
- "-c",
- "--cuda_deb",
- help="cuda deb package, download from: https://developer.nvidia.com/cuda-downloads",
- dest="cuda_deb",
- type=str,
- required=True,
- )
-
- parser.add_argument(
- "-a",
- "--cuda_aarch64_deb",
- help="cuda aarch64 libs package: download from: https://developer.nvidia.com/cuda-downloads",
- type=str,
- dest="cuda_aarch64_deb",
- )
-
- args = parser.parse_args()
-
- if (args.target_aarch == 'x86-64' and args.sbsa_mode):
- print('ERROR: sbsa_mode only support target_aarch = \'aarch64\' now')
- exit(-1)
-
- if (args.sbsa_mode and not args.cuda_aarch64_deb):
- print('ERROR: sbsa_mode need -a/--cuda_aarch64_deb to provide cuda aarch64 libs package')
- exit(-1)
-
- if (not os.path.isfile(args.cuda_deb)):
- print('ERROR: can not find file:{}'.format(args.cuda_deb))
- exit(-1)
-
- if (args.sbsa_mode and not os.path.isfile(args.cuda_aarch64_deb)):
- print('ERROR: can not find file:{}'.format(args.cuda_aarch64_deb))
- exit(-1)
-
- if (not os.path.isfile(args.cudnn_deb)):
- print('ERROR: can not find file:{}'.format(args.cudnn_deb))
- exit(-1)
-
- if (not os.path.isfile(args.trt_deb)):
- print('ERROR: can not find file:{}'.format(args.trt_deb))
- exit(-1)
-
- print("CONFIG SUMMARY: create cuda cmake build libs for {}, is for sbsa_mode: {}".format(args.target_aarch, args.sbsa_mode))
-
- cmd = 'rm -rf output && mkdir output'
- subprocess.check_call(cmd, shell=True)
-
- #handle cuda
- handle_cuda_libs(args.cuda_deb)
-
- #handle sbsa_mode
- if (args.sbsa_mode):
- handle_cuda_libs(args.cuda_aarch64_deb)
-
- # check cuda/sbsa_mode valid and handle link
- nvcc = glob.glob('./output/*/bin/nvcc', recursive=True)
- cuda_version = nvcc[0][9:-9]
- print('cuda version: {}'.format(cuda_version))
- assert(len(nvcc) == 1)
- if (args.sbsa_mode):
- subprocess.check_call('file {} | grep {}'.format(nvcc[0], 'x86-64'), shell=True)
- remove_x86_64_libs = ['targets/x86_64-linux', 'include', 'lib64']
- for remove_lib in remove_x86_64_libs:
- subprocess.check_call('rm -rf ./output/{}/{}'.format(cuda_version, remove_lib), shell=True)
- #create link for sbsa
- cwd = os.getcwd()
- os.chdir('output/{}'.format(cuda_version))
- cmd = 'ln -s targets/sbsa-linux/include/ include && ln -s targets/sbsa-linux/lib/ lib64'
- subprocess.check_call(cmd, shell=True)
- #handle libnvrtc.so
- readelf_nvrtc = os.popen('readelf -d lib64/stubs/libnvrtc.so | grep SONAME').read().split('\n')[0]
- loc = readelf_nvrtc.find('[')
- libnvrtc_with_version = readelf_nvrtc[loc+1:-1]
- print('libnvrtc_with_version: {}'.format(libnvrtc_with_version))
- cmd = 'cp lib64/stubs/libnvrtc.so lib64/{}'.format(libnvrtc_with_version)
- subprocess.check_call(cmd, shell=True)
- os.chdir(cwd)
- else:
- subprocess.check_call('file {} | grep {}'.format(nvcc[0], args.target_aarch), shell=True)
-
- # handle cudnn
- subprocess.check_call('rm -rf tmp && rm -rf tmp_sub && mkdir tmp', shell=True)
- print('\nhandle cuda file from.{}'.format(args.cudnn_deb))
- # FIXME: later release cudnn may dir not with cuda, nvidia may fix later!!
- cmd = 'tar -xvf {} -C tmp && mv tmp/cuda output/cudnn'.format(args.cudnn_deb)
- subprocess.check_call(cmd, shell=True)
- cudnn_libs = glob.glob('output/cudnn/lib64/libcudnn.so*')
- cudnn_real_libs = []
- for lib in cudnn_libs:
- if (not os.path.islink(lib)):
- cudnn_real_libs.append(lib)
- assert(len(cudnn_real_libs) > 0)
- for lib in cudnn_real_libs:
- subprocess.check_call('file {} | grep {}'.format(lib, args.target_aarch), shell=True)
-
- # handle trt
- print('\nhandle cuda file from.{}'.format(args.trt_deb))
- cmd = 'tar -xvf {} -C output'.format(args.trt_deb)
- subprocess.check_call(cmd, shell=True)
- trt_libs = glob.glob('output/TensorRT-*/lib/libnvinfer.so.*')
- trt_real_libs = []
- for lib in trt_libs:
- if (not os.path.islink(lib)):
- trt_real_libs.append(lib)
- assert(len(trt_real_libs) > 0)
- for lib in trt_real_libs:
- subprocess.check_call('file {} | grep {}'.format(lib, args.target_aarch), shell=True)
-
- if __name__ == "__main__":
- main()
|