1#/*
2# * FreeRTOS Kernel V11.1.0
3# * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.
4# *
5# * SPDX-License-Identifier: MIT
6# *
7# * Permission is hereby granted, free of charge, to any person obtaining a copy of
8# * this software and associated documentation files (the "Software"), to deal in
9# * the Software without restriction, including without limitation the rights to
10# * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
11# * the Software, and to permit persons to whom the Software is furnished to do so,
12# * subject to the following conditions:
13# *
14# * The above copyright notice and this permission notice shall be included in all
15# * copies or substantial portions of the Software.
16# *
17# * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18# * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
19# * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
20# * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
21# * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22# * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23# *
24# * https://www.FreeRTOS.org
25# * https://github.com/FreeRTOS
26# *
27# */
28
29import os
30import shutil
31
32_THIS_FILE_DIRECTORY_ = os.path.dirname(os.path.realpath(__file__))
33_FREERTOS_PORTABLE_DIRECTORY_ = os.path.dirname(_THIS_FILE_DIRECTORY_)
34
35_COMPILERS_ = ['GCC', 'IAR']
36_ARCH_NS_ = ['ARM_CM85', 'ARM_CM85_NTZ', 'ARM_CM55', 'ARM_CM55_NTZ', 'ARM_CM35P', 'ARM_CM35P_NTZ', 'ARM_CM33', 'ARM_CM33_NTZ', 'ARM_CM23', 'ARM_CM23_NTZ']
37_ARCH_S_ = ['ARM_CM85', 'ARM_CM55', 'ARM_CM35P', 'ARM_CM33', 'ARM_CM23']
38
39# Files to be compiled in the Secure Project
40_SECURE_COMMON_FILE_PATHS_ = [
41    os.path.join('secure', 'context'),
42    os.path.join('secure', 'heap'),
43    os.path.join('secure', 'init'),
44    os.path.join('secure', 'macros')
45]
46
47_SECURE_PORTABLE_FILE_PATHS_ = {
48    'GCC':{
49        'ARM_CM23' :[os.path.join('secure', 'context', 'portable', 'GCC', 'ARM_CM23')],
50        'ARM_CM33' :[os.path.join('secure', 'context', 'portable', 'GCC', 'ARM_CM33')],
51        'ARM_CM35P':[os.path.join('secure', 'context', 'portable', 'GCC', 'ARM_CM33')],
52        'ARM_CM55' :[os.path.join('secure', 'context', 'portable', 'GCC', 'ARM_CM33')],
53        'ARM_CM85' :[os.path.join('secure', 'context', 'portable', 'GCC', 'ARM_CM33')]
54    },
55    'IAR':{
56        'ARM_CM23' :[os.path.join('secure', 'context', 'portable', 'IAR', 'ARM_CM23')],
57        'ARM_CM33' :[os.path.join('secure', 'context', 'portable', 'IAR', 'ARM_CM33')],
58        'ARM_CM35P':[os.path.join('secure', 'context', 'portable', 'IAR', 'ARM_CM33')],
59        'ARM_CM55' :[os.path.join('secure', 'context', 'portable', 'IAR', 'ARM_CM33')],
60        'ARM_CM85' :[os.path.join('secure', 'context', 'portable', 'IAR', 'ARM_CM33')]
61    }
62}
63
64# Files to be compiled in the Non-Secure Project
65_NONSECURE_COMMON_FILE_PATHS_ = [
66    'non_secure'
67]
68
69_NONSECURE_PORTABLE_FILE_PATHS_ = {
70    'GCC':{
71        'ARM_CM23'      : [os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM23')],
72        'ARM_CM23_NTZ'  : [os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM23_NTZ')],
73        'ARM_CM33'      : [os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM33')],
74        'ARM_CM33_NTZ'  : [os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM33_NTZ')],
75        'ARM_CM35P'     : [os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM33', 'portasm.c'),
76                           os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM33', 'mpu_wrappers_v2_asm.c'),
77                           os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM35P', 'portmacro.h')],
78        'ARM_CM35P_NTZ' : [os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM33_NTZ', 'portasm.c'),
79                           os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM33_NTZ', 'mpu_wrappers_v2_asm.c'),
80                           os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM35P', 'portmacro.h')],
81        'ARM_CM55'      : [os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM33', 'portasm.c'),
82                           os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM33', 'mpu_wrappers_v2_asm.c'),
83                           os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM55', 'portmacro.h')],
84        'ARM_CM55_NTZ'  : [os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM33_NTZ', 'portasm.c'),
85                           os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM33_NTZ', 'mpu_wrappers_v2_asm.c'),
86                           os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM55', 'portmacro.h')],
87        'ARM_CM85'      : [os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM33', 'portasm.c'),
88                           os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM33', 'mpu_wrappers_v2_asm.c'),
89                           os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM85', 'portmacro.h')],
90        'ARM_CM85_NTZ'  : [os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM33_NTZ', 'portasm.c'),
91                           os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM33_NTZ', 'mpu_wrappers_v2_asm.c'),
92                           os.path.join('non_secure', 'portable', 'GCC', 'ARM_CM85', 'portmacro.h')]
93    },
94    'IAR':{
95        'ARM_CM23'      : [os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM23')],
96        'ARM_CM23_NTZ'  : [os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM23_NTZ')],
97        'ARM_CM33'      : [os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM33')],
98        'ARM_CM33_NTZ'  : [os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM33_NTZ')],
99        'ARM_CM35P'     : [os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM33', 'portasm.s'),
100                           os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM33', 'mpu_wrappers_v2_asm.S'),
101                           os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM35P', 'portmacro.h')],
102        'ARM_CM35P_NTZ' : [os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM33_NTZ', 'portasm.s'),
103                           os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM33_NTZ', 'mpu_wrappers_v2_asm.S'),
104                           os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM35P', 'portmacro.h')],
105        'ARM_CM55'      : [os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM33', 'portasm.s'),
106                           os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM33', 'mpu_wrappers_v2_asm.S'),
107                           os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM55', 'portmacro.h')],
108        'ARM_CM55_NTZ'  : [os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM33_NTZ', 'portasm.s'),
109                           os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM33_NTZ', 'mpu_wrappers_v2_asm.S'),
110                           os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM55', 'portmacro.h')],
111        'ARM_CM85'      : [os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM33', 'portasm.s'),
112                           os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM33', 'mpu_wrappers_v2_asm.S'),
113                           os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM85', 'portmacro.h')],
114        'ARM_CM85_NTZ'  : [os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM33_NTZ', 'portasm.s'),
115                           os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM33_NTZ', 'mpu_wrappers_v2_asm.S'),
116                           os.path.join('non_secure', 'portable', 'IAR', 'ARM_CM85', 'portmacro.h')]
117    },
118}
119
120
121def copy_files_in_dir(src_abs_path, dst_abs_path):
122    if os.path.isfile(src_abs_path):
123        print('Src: {}'.format(src_abs_path))
124        print('Dst: {}\n'.format(dst_abs_path))
125        shutil.copy2(src_abs_path, dst_abs_path)
126    else:
127        for src_file in os.listdir(src_abs_path):
128            src_file_abs_path = os.path.join(src_abs_path, src_file)
129            if os.path.isfile(src_file_abs_path) and src_file != 'ReadMe.txt':
130                if not os.path.exists(dst_abs_path):
131                    os.makedirs(dst_abs_path)
132                print('Src: {}'.format(src_file_abs_path))
133                print('Dst: {}\n'.format(dst_abs_path))
134                shutil.copy2(src_file_abs_path, dst_abs_path)
135
136
137def copy_common_files_for_compiler_and_arch(compiler, arch, src_paths, dst_path):
138    for src_path in src_paths:
139
140        src_abs_path = os.path.join(_THIS_FILE_DIRECTORY_, src_path)
141        dst_abs_path = os.path.join(_FREERTOS_PORTABLE_DIRECTORY_, compiler, arch, dst_path)
142
143        copy_files_in_dir(src_abs_path, dst_abs_path)
144
145
146def copy_portable_files_for_compiler_and_arch(compiler, arch, src_paths, dst_path):
147    for src_path in src_paths[compiler][arch]:
148
149        src_abs_path = os.path.join(_THIS_FILE_DIRECTORY_, src_path)
150        dst_abs_path = os.path.join(_FREERTOS_PORTABLE_DIRECTORY_, compiler, arch, dst_path)
151
152        copy_files_in_dir(src_abs_path, dst_abs_path)
153
154
155def copy_files():
156    # Copy Secure Files
157    for compiler in _COMPILERS_:
158        for arch in _ARCH_S_:
159            copy_common_files_for_compiler_and_arch(compiler, arch, _SECURE_COMMON_FILE_PATHS_, 'secure')
160            copy_portable_files_for_compiler_and_arch(compiler, arch, _SECURE_PORTABLE_FILE_PATHS_, 'secure')
161
162    # Copy Non-Secure Files
163    for compiler in _COMPILERS_:
164        for arch in _ARCH_NS_:
165            copy_common_files_for_compiler_and_arch(compiler, arch, _NONSECURE_COMMON_FILE_PATHS_, 'non_secure')
166            copy_portable_files_for_compiler_and_arch(compiler, arch, _NONSECURE_PORTABLE_FILE_PATHS_, 'non_secure')
167
168
169def main():
170    copy_files()
171
172
173if __name__ == '__main__':
174    main()
175