quickjs-tart

quickjs-based runtime for wallet-core logic
Log | Files | Refs | README | LICENSE

generate_visualc_files.pl (9129B)


      1 #!/usr/bin/env perl
      2 
      3 # Generate main file, individual apps and solution files for
      4 # MS Visual Studio 2017
      5 #
      6 # Must be run from Mbed TLS root or scripts directory.
      7 # Takes no argument.
      8 #
      9 # Copyright The Mbed TLS Contributors
     10 # SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
     11 
     12 use warnings;
     13 use strict;
     14 use Digest::MD5 'md5_hex';
     15 
     16 my $vsx_dir = "visualc/VS2017";
     17 my $vsx_ext = "vcxproj";
     18 my $vsx_app_tpl_file = "scripts/data_files/vs2017-app-template.$vsx_ext";
     19 my $vsx_main_tpl_file = "scripts/data_files/vs2017-main-template.$vsx_ext";
     20 my $vsx_main_file = "$vsx_dir/mbedTLS.$vsx_ext";
     21 my $vsx_sln_tpl_file = "scripts/data_files/vs2017-sln-template.sln";
     22 my $vsx_sln_file = "$vsx_dir/mbedTLS.sln";
     23 
     24 my $programs_dir = 'programs';
     25 my $framework_programs_dir = 'framework/tests/programs';
     26 my $mbedtls_header_dir = 'include/mbedtls';
     27 my $psa_header_dir = 'include/psa';
     28 my $source_dir = 'library';
     29 my $tls_test_source_dir = 'tests/src';
     30 my $tls_test_header_dir = 'tests/include/test';
     31 my $test_source_dir = 'framework/tests/src';
     32 my $test_header_dir = 'framework/tests/include/test';
     33 my $test_drivers_header_dir = 'framework/tests/include/test/drivers';
     34 my $test_drivers_source_dir = 'framework/tests/src/drivers';
     35 
     36 my @thirdparty_header_dirs = qw(
     37     3rdparty/everest/include/everest
     38 );
     39 my @thirdparty_source_dirs = qw(
     40     3rdparty/everest/library
     41     3rdparty/everest/library/kremlib
     42     3rdparty/everest/library/legacy
     43 );
     44 
     45 # Directories to add to the include path.
     46 # Order matters in case there are files with the same name in more than
     47 # one directory: the compiler will use the first match.
     48 my @include_directories = qw(
     49     include
     50     3rdparty/everest/include/
     51     3rdparty/everest/include/everest
     52     3rdparty/everest/include/everest/vs2013
     53     3rdparty/everest/include/everest/kremlib
     54     tests/include
     55     framework/tests/include
     56     framework/tests/programs
     57 );
     58 my $include_directories = join(';', map {"../../$_"} @include_directories);
     59 
     60 # Directories to add to the include path when building the library, but not
     61 # when building tests or applications.
     62 my @library_include_directories = qw(
     63     library
     64 );
     65 my $library_include_directories =
     66   join(';', map {"../../$_"} (@library_include_directories,
     67                               @include_directories));
     68 
     69 my @excluded_files = qw(
     70     3rdparty/everest/library/Hacl_Curve25519.c
     71 );
     72 my %excluded_files = ();
     73 foreach (@excluded_files) { $excluded_files{$_} = 1 }
     74 
     75 my $vsx_hdr_tpl = <<EOT;
     76     <ClInclude Include="..\\..\\{NAME}" />
     77 EOT
     78 my $vsx_src_tpl = <<EOT;
     79     <ClCompile Include="..\\..\\{NAME}" />
     80 EOT
     81 
     82 my $vsx_sln_app_entry_tpl = <<EOT;
     83 Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "{APPNAME}", "{APPNAME}.vcxproj", "{GUID}"
     84 	ProjectSection(ProjectDependencies) = postProject
     85 		{46CF2D25-6A36-4189-B59C-E4815388E554} = {46CF2D25-6A36-4189-B59C-E4815388E554}
     86 	EndProjectSection
     87 EndProject
     88 EOT
     89 
     90 my $vsx_sln_conf_entry_tpl = <<EOT;
     91 		{GUID}.Debug|Win32.ActiveCfg = Debug|Win32
     92 		{GUID}.Debug|Win32.Build.0 = Debug|Win32
     93 		{GUID}.Debug|x64.ActiveCfg = Debug|x64
     94 		{GUID}.Debug|x64.Build.0 = Debug|x64
     95 		{GUID}.Release|Win32.ActiveCfg = Release|Win32
     96 		{GUID}.Release|Win32.Build.0 = Release|Win32
     97 		{GUID}.Release|x64.ActiveCfg = Release|x64
     98 		{GUID}.Release|x64.Build.0 = Release|x64
     99 EOT
    100 
    101 exit( main() );
    102 
    103 sub check_dirs {
    104     foreach my $d (@thirdparty_header_dirs, @thirdparty_source_dirs) {
    105         if (not (-d $d)) { return 0; }
    106     }
    107     return -d $vsx_dir
    108         && -d $mbedtls_header_dir
    109         && -d $psa_header_dir
    110         && -d $source_dir
    111         && -d $test_source_dir
    112         && -d $tls_test_source_dir
    113         && -d $test_drivers_source_dir
    114         && -d $test_header_dir
    115         && -d $tls_test_header_dir
    116         && -d $test_drivers_header_dir
    117         && -d $programs_dir
    118         && -d $framework_programs_dir;
    119 }
    120 
    121 sub slurp_file {
    122     my ($filename) = @_;
    123 
    124     local $/ = undef;
    125     open my $fh, '<:crlf', $filename or die "Could not read $filename\n";
    126     my $content = <$fh>;
    127     close $fh;
    128 
    129     return $content;
    130 }
    131 
    132 sub content_to_file {
    133     my ($content, $filename) = @_;
    134 
    135     open my $fh, '>:crlf', $filename or die "Could not write to $filename\n";
    136     print $fh $content;
    137     close $fh;
    138 }
    139 
    140 sub gen_app_guid {
    141     my ($path) = @_;
    142 
    143     my $guid = md5_hex( "mbedTLS:$path" );
    144     $guid =~ s/(.{8})(.{4})(.{4})(.{4})(.{12})/\U{$1-$2-$3-$4-$5}/;
    145 
    146     return $guid;
    147 }
    148 
    149 sub gen_app {
    150     my ($path, $template, $dir, $ext) = @_;
    151 
    152     my $guid = gen_app_guid( $path );
    153     $path =~ s!/!\\!g;
    154     (my $appname = $path) =~ s/.*\\//;
    155     my $is_test_app = ($path =~ m/^test\\/);
    156 
    157     my $srcs;
    158     if( $appname eq "metatest" or $appname eq "query_compile_time_config" or
    159         $appname eq "query_included_headers" or $appname eq "zeroize" ) {
    160         $srcs = "<ClCompile Include=\"..\\..\\framework\\tests\\programs\\$appname.c\" \/>";
    161     } else {
    162         $srcs = "<ClCompile Include=\"..\\..\\programs\\$path.c\" \/>";
    163     }
    164 
    165     if( $appname eq "ssl_client2" or $appname eq "ssl_server2" or
    166         $appname eq "query_compile_time_config" ) {
    167         $srcs .= "\n    <ClCompile Include=\"..\\..\\programs\\test\\query_config.c\" \/>";
    168     }
    169     if( $appname eq "ssl_client2" or $appname eq "ssl_server2" ) {
    170         $srcs .= "\n    <ClCompile Include=\"..\\..\\programs\\ssl\\ssl_test_lib.c\" \/>";
    171     }
    172 
    173     my $content = $template;
    174     $content =~ s/<SOURCES>/$srcs/g;
    175     $content =~ s/<APPNAME>/$appname/g;
    176     $content =~ s/<GUID>/$guid/g;
    177     $content =~ s/INCLUDE_DIRECTORIES\n/($is_test_app ?
    178                                          $library_include_directories :
    179                                          $include_directories)/ge;
    180 
    181     content_to_file( $content, "$dir/$appname.$ext" );
    182 }
    183 
    184 sub get_app_list {
    185     my $makefile_contents = slurp_file('programs/Makefile');
    186     $makefile_contents =~ /\n\s*APPS\s*=[\\\s]*(.*?)(?<!\\)[\#\n]/s
    187       or die "Cannot find APPS = ... in programs/Makefile\n";
    188     return split /(?:\s|\\)+/, $1;
    189 }
    190 
    191 sub gen_app_files {
    192     my @app_list = @_;
    193 
    194     my $vsx_tpl = slurp_file( $vsx_app_tpl_file );
    195 
    196     for my $app ( @app_list ) {
    197         gen_app( $app, $vsx_tpl, $vsx_dir, $vsx_ext );
    198     }
    199 }
    200 
    201 sub gen_entry_list {
    202     my ($tpl, @names) = @_;
    203 
    204     my $entries;
    205     for my $name (@names) {
    206         (my $entry = $tpl) =~ s/{NAME}/$name/g;
    207         $entries .= $entry;
    208     }
    209 
    210     return $entries;
    211 }
    212 
    213 sub gen_main_file {
    214     my ($headers, $sources,
    215         $hdr_tpl, $src_tpl,
    216         $main_tpl, $main_out) = @_;
    217 
    218     my $header_entries = gen_entry_list( $hdr_tpl, @$headers );
    219     my $source_entries = gen_entry_list( $src_tpl, @$sources );
    220 
    221     my $out = slurp_file( $main_tpl );
    222     $out =~ s/SOURCE_ENTRIES\n/$source_entries/m;
    223     $out =~ s/HEADER_ENTRIES\n/$header_entries/m;
    224     $out =~ s/INCLUDE_DIRECTORIES\n/$library_include_directories/g;
    225 
    226     content_to_file( $out, $main_out );
    227 }
    228 
    229 sub gen_vsx_solution {
    230     my (@app_names) = @_;
    231 
    232     my ($app_entries, $conf_entries);
    233     for my $path (@app_names) {
    234         my $guid = gen_app_guid( $path );
    235         (my $appname = $path) =~ s!.*/!!;
    236 
    237         my $app_entry = $vsx_sln_app_entry_tpl;
    238         $app_entry =~ s/{APPNAME}/$appname/g;
    239         $app_entry =~ s/{GUID}/$guid/g;
    240 
    241         $app_entries .= $app_entry;
    242 
    243         my $conf_entry = $vsx_sln_conf_entry_tpl;
    244         $conf_entry =~ s/{GUID}/$guid/g;
    245 
    246         $conf_entries .= $conf_entry;
    247     }
    248 
    249     my $out = slurp_file( $vsx_sln_tpl_file );
    250     $out =~ s/APP_ENTRIES\n/$app_entries/m;
    251     $out =~ s/CONF_ENTRIES\n/$conf_entries/m;
    252 
    253     content_to_file( $out, $vsx_sln_file );
    254 }
    255 
    256 sub del_vsx_files {
    257     unlink glob "'$vsx_dir/*.$vsx_ext'";
    258     unlink $vsx_main_file;
    259     unlink $vsx_sln_file;
    260 }
    261 
    262 sub main {
    263     if( ! check_dirs() ) {
    264         chdir '..' or die;
    265         check_dirs or die "Must be run from Mbed TLS root or scripts dir\n";
    266     }
    267 
    268     # Remove old files to ensure that, for example, project files from deleted
    269     # apps are not kept
    270     del_vsx_files();
    271 
    272     my @app_list = get_app_list();
    273     my @header_dirs = (
    274                        $mbedtls_header_dir,
    275                        $psa_header_dir,
    276                        $test_header_dir,
    277                        $tls_test_header_dir,
    278                        $test_drivers_header_dir,
    279                        $source_dir,
    280                        $framework_programs_dir,
    281                        @thirdparty_header_dirs,
    282                       );
    283     my @headers = (map { <$_/*.h> } @header_dirs);
    284     my @source_dirs = (
    285                        $source_dir,
    286                        $test_source_dir,
    287                        $tls_test_source_dir,
    288                        $test_drivers_source_dir,
    289                        @thirdparty_source_dirs,
    290                       );
    291     my @sources = (map { <$_/*.c> } @source_dirs);
    292 
    293     @headers = grep { ! $excluded_files{$_} } @headers;
    294     @sources = grep { ! $excluded_files{$_} } @sources;
    295     map { s!/!\\!g } @headers;
    296     map { s!/!\\!g } @sources;
    297 
    298     gen_app_files( @app_list );
    299 
    300     gen_main_file( \@headers, \@sources,
    301                    $vsx_hdr_tpl, $vsx_src_tpl,
    302                    $vsx_main_tpl_file, $vsx_main_file );
    303 
    304     gen_vsx_solution( @app_list );
    305 
    306     return 0;
    307 }