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