generate_features.pl (2439B)
1 #!/usr/bin/env perl 2 # 3 # Copyright The Mbed TLS Contributors 4 # SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later 5 6 use strict; 7 8 my ($include_dir, $data_dir, $feature_file); 9 10 if( @ARGV ) { 11 die "Invalid number of arguments" if scalar @ARGV != 3; 12 ($include_dir, $data_dir, $feature_file) = @ARGV; 13 14 -d $include_dir or die "No such directory: $include_dir\n"; 15 -d $data_dir or die "No such directory: $data_dir\n"; 16 } else { 17 $include_dir = 'include/mbedtls'; 18 $data_dir = 'scripts/data_files'; 19 $feature_file = 'library/version_features.c'; 20 21 unless( -d $include_dir && -d $data_dir ) { 22 chdir '..' or die; 23 -d $include_dir && -d $data_dir 24 or die "Without arguments, must be run from root or scripts\n" 25 } 26 } 27 28 my $feature_format_file = $data_dir.'/version_features.fmt'; 29 30 my @sections = ( "System support", "Mbed TLS modules", 31 "Mbed TLS feature support" ); 32 33 my $line_separator = $/; 34 undef $/; 35 36 open(FORMAT_FILE, '<:crlf', "$feature_format_file") or die "Opening feature format file '$feature_format_file': $!"; 37 my $feature_format = <FORMAT_FILE>; 38 close(FORMAT_FILE); 39 40 $/ = $line_separator; 41 42 open(CONFIG_H, '<:crlf', "$include_dir/mbedtls_config.h") || die("Failure when opening mbedtls_config.h: $!"); 43 44 my $feature_defines = ""; 45 my $in_section = 0; 46 47 while (my $line = <CONFIG_H>) 48 { 49 next if ($in_section && $line !~ /#define/ && $line !~ /SECTION/); 50 next if (!$in_section && $line !~ /SECTION/); 51 52 if ($in_section) { 53 if ($line =~ /SECTION/) { 54 $in_section = 0; 55 next; 56 } 57 # Strip leading MBEDTLS_ to save binary size 58 my ($mbedtls_prefix, $define) = $line =~ /#define (MBEDTLS_)?(\w+)/; 59 if (!$mbedtls_prefix) { 60 die "Feature does not start with 'MBEDTLS_': $line\n"; 61 } 62 $feature_defines .= "#if defined(MBEDTLS_${define})\n"; 63 $feature_defines .= " \"${define}\", //no-check-names\n"; 64 $feature_defines .= "#endif /* MBEDTLS_${define} */\n"; 65 } 66 67 if (!$in_section) { 68 my ($section_name) = $line =~ /SECTION: ([\w ]+)/; 69 my $found_section = grep $_ eq $section_name, @sections; 70 71 $in_section = 1 if ($found_section); 72 } 73 }; 74 75 $feature_format =~ s/FEATURE_DEFINES\n/$feature_defines/g; 76 77 open(ERROR_FILE, ">$feature_file") or die "Opening destination file '$feature_file': $!"; 78 print ERROR_FILE $feature_format; 79 close(ERROR_FILE);