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