| #!/usr/bin/env python3 | |
| #/* | |
| # * FreeRTOS Kernel <DEVELOPMENT BRANCH> | |
| # * Copyright (C) 2024 Amazon.com, Inc. or its affiliates. All Rights Reserved. | |
| # * | |
| # * SPDX-License-Identifier: MIT | |
| # * | |
| # * Permission is hereby granted, free of charge, to any person obtaining a copy of | |
| # * this software and associated documentation files (the "Software"), to deal in | |
| # * the Software without restriction, including without limitation the rights to | |
| # * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of | |
| # * the Software, and to permit persons to whom the Software is furnished to do so, | |
| # * subject to the following conditions: | |
| # * | |
| # * The above copyright notice and this permission notice shall be included in all | |
| # * copies or substantial portions of the Software. | |
| # * | |
| # * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |
| # * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS | |
| # * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR | |
| # * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER | |
| # * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN | |
| # * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | |
| # * | |
| # * https://www.FreeRTOS.org | |
| # * https://github.com/FreeRTOS | |
| # * | |
| # */ | |
| import os | |
| import re | |
| from common.header_checker import HeaderChecker | |
| #-------------------------------------------------------------------------------------------------- | |
| # CONFIG | |
| #-------------------------------------------------------------------------------------------------- | |
| KERNEL_IGNORED_FILES = [ | |
| 'FreeRTOS-openocd.c', | |
| 'Makefile', | |
| '.DS_Store', | |
| 'cspell.config.yaml', | |
| '.clang-format' | |
| ] | |
| KERNEL_IGNORED_EXTENSIONS = [ | |
| '.yml', | |
| '.css', | |
| '.idx', | |
| '.md', | |
| '.url', | |
| '.sty', | |
| '.0-rc2', | |
| '.s82', | |
| '.js', | |
| '.out', | |
| '.pack', | |
| '.2', | |
| '.1-kernel-only', | |
| '.0-kernel-only', | |
| '.0-rc1', | |
| '.readme', | |
| '.tex', | |
| '.png', | |
| '.bat', | |
| '.sh', | |
| '.txt', | |
| '.cmake', | |
| '.config' | |
| ] | |
| KERNEL_ASM_EXTENSIONS = [ | |
| '.s', | |
| '.S', | |
| '.src', | |
| '.inc', | |
| '.s26', | |
| '.s43', | |
| '.s79', | |
| '.s85', | |
| '.s87', | |
| '.s90', | |
| '.asm', | |
| '.h' | |
| ] | |
| KERNEL_PY_EXTENSIONS = [ | |
| '.py' | |
| ] | |
| KERNEL_IGNORED_PATTERNS = [ | |
| r'.*\.git.*', | |
| r'.*portable/IAR/AtmelSAM7S64/.*AT91SAM7.*', | |
| r'.*portable/GCC/ARM7_AT91SAM7S/.*', | |
| r'.*portable/MPLAB/PIC18F/stdio.h', | |
| r'.*portable/ThirdParty/xClang/XCOREAI/*', | |
| r'.*IAR/ARM_C*', | |
| r'.*IAR/78K0R/*', | |
| r'.*CCS/MSP430X/*', | |
| r'.*portable/template/*', | |
| r'.*template_configuration/*' | |
| ] | |
| KERNEL_THIRD_PARTY_PATTERNS = [ | |
| r'.*portable/ThirdParty/GCC/Posix/port*', | |
| r'.*portable/ThirdParty/*', | |
| r'.*portable/IAR/AVR32_UC3/.*', | |
| r'.*portable/GCC/AVR32_UC3/.*', | |
| ] | |
| KERNEL_ARM_COLLAB_FILES_PATTERNS = [ | |
| r'.*portable/ARMv8M/*', | |
| r'.*portable/.*/ARM_CM23*', | |
| r'.*portable/.*/ARM_CM33*', | |
| r'.*portable/.*/ARM_CM35*', | |
| r'.*portable/.*/ARM_CM55*', | |
| r'.*portable/.*/ARM_CM85*', | |
| ] | |
| KERNEL_HEADER = [ | |
| '/*\n', | |
| ' * FreeRTOS Kernel <DEVELOPMENT BRANCH>\n', | |
| ' * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved.\n', | |
| ' *\n', | |
| ' * SPDX-License-Identifier: MIT\n', | |
| ' *\n', | |
| ' * Permission is hereby granted, free of charge, to any person obtaining a copy of\n', | |
| ' * this software and associated documentation files (the "Software"), to deal in\n', | |
| ' * the Software without restriction, including without limitation the rights to\n', | |
| ' * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\n', | |
| ' * the Software, and to permit persons to whom the Software is furnished to do so,\n', | |
| ' * subject to the following conditions:\n', | |
| ' *\n', | |
| ' * The above copyright notice and this permission notice shall be included in all\n', | |
| ' * copies or substantial portions of the Software.\n', | |
| ' *\n', | |
| ' * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n', | |
| ' * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\n', | |
| ' * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\n', | |
| ' * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\n', | |
| ' * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\n', | |
| ' * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n', | |
| ' *\n', | |
| ' * https://www.FreeRTOS.org\n', | |
| ' * https://github.com/FreeRTOS\n', | |
| ' *\n', | |
| ' */\n', | |
| ] | |
| FREERTOS_COPYRIGHT_REGEX = r"^(;|#)?( *(\/\*|\*|#|\/\/))? Copyright \(C\) 20\d\d Amazon.com, Inc. or its affiliates. All Rights Reserved\.( \*\/)?$" | |
| FREERTOS_ARM_COLLAB_COPYRIGHT_REGEX = r"(^(;|#)?( *(\/\*|\*|#|\/\/))? Copyright \(C\) 20\d\d Amazon.com, Inc. or its affiliates. All Rights Reserved\.( \*\/)?$)|" + \ | |
| r"(^(;|#)?( *(\/\*|\*|#|\/\/))? Copyright 20\d\d Arm Limited and/or its affiliates( \*\/)?$)|" + \ | |
| r"(^(;|#)?( *(\/\*|\*|#|\/\/))? <open-source-office@arm.com>( \*\/)?$)" | |
| class KernelHeaderChecker(HeaderChecker): | |
| def __init__( | |
| self, | |
| header, | |
| padding=1000, | |
| ignored_files=None, | |
| ignored_ext=None, | |
| ignored_patterns=None, | |
| py_ext=None, | |
| asm_ext=None, | |
| third_party_patterns=None, | |
| copyright_regex = None | |
| ): | |
| super().__init__(header, padding, ignored_files, ignored_ext, ignored_patterns, | |
| py_ext, asm_ext, third_party_patterns, copyright_regex) | |
| self.armCollabRegex = re.compile(FREERTOS_ARM_COLLAB_COPYRIGHT_REGEX) | |
| self.armCollabFilesPatternList = [] | |
| for pattern in KERNEL_ARM_COLLAB_FILES_PATTERNS: | |
| self.armCollabFilesPatternList.append(re.compile(pattern)) | |
| def isArmCollabFile(self, path): | |
| for pattern in self.armCollabFilesPatternList: | |
| if pattern.match(path): | |
| return True | |
| return False | |
| def checkArmCollabFile(self, path): | |
| isValid = False | |
| file_ext = os.path.splitext(path)[-1] | |
| with open(path, encoding="utf-8", errors="ignore") as file: | |
| chunk = file.read(len("".join(self.header)) + self.padding) | |
| lines = [("%s\n" % line) for line in chunk.strip().splitlines()][ | |
| : len(self.header) + 2 | |
| ] | |
| if (len(lines) > 0) and (lines[0].find("#!") == 0): | |
| lines.remove(lines[0]) | |
| # Split lines in sections. | |
| headers = dict() | |
| headers["text"] = [] | |
| headers["copyright"] = [] | |
| headers["spdx"] = [] | |
| for line in lines: | |
| if self.armCollabRegex.match(line): | |
| headers["copyright"].append(line) | |
| elif "SPDX-License-Identifier:" in line: | |
| headers["spdx"].append(line) | |
| else: | |
| headers["text"].append(line) | |
| text_equal = self.isValidHeaderSection(file_ext, "text", headers["text"]) | |
| spdx_equal = self.isValidHeaderSection(file_ext, "spdx", headers["spdx"]) | |
| if text_equal and spdx_equal and len(headers["copyright"]) == 3: | |
| isValid = True | |
| return isValid | |
| def customCheck(self, path): | |
| isValid = False | |
| if self.isArmCollabFile(path): | |
| isValid = self.checkArmCollabFile(path) | |
| return isValid | |
| def main(): | |
| parser = HeaderChecker.configArgParser() | |
| args = parser.parse_args() | |
| # Configure the checks then run | |
| checker = KernelHeaderChecker(KERNEL_HEADER, | |
| copyright_regex=FREERTOS_COPYRIGHT_REGEX, | |
| ignored_files=KERNEL_IGNORED_FILES, | |
| ignored_ext=KERNEL_IGNORED_EXTENSIONS, | |
| ignored_patterns=KERNEL_IGNORED_PATTERNS, | |
| third_party_patterns=KERNEL_THIRD_PARTY_PATTERNS, | |
| py_ext=KERNEL_PY_EXTENSIONS, | |
| asm_ext=KERNEL_ASM_EXTENSIONS) | |
| checker.ignoreFile(os.path.split(__file__)[-1]) | |
| rc = checker.processArgs(args) | |
| if rc: | |
| checker.showHelp(__file__) | |
| return rc | |
| if __name__ == '__main__': | |
| exit(main()) |