Don't require make to generate visualc files

Don't run `make list` to obtain the list of programs in
generate_visualc_files.pl. This doesn't work on Windows when a `make`
command is not available. Instead, read the makefile.

Signed-off-by: Gilles Peskine <Gilles.Peskine@arm.com>
diff --git a/programs/Makefile b/programs/Makefile
index 5795cd6..dcdb8f3 100644
--- a/programs/Makefile
+++ b/programs/Makefile
@@ -51,72 +51,79 @@
 PYTHON ?= $(shell if type python3 >/dev/null 2>/dev/null; then echo python3; else echo python; fi)
 endif
 
+## The following assignment is the list of base names of applications that
+## will be built on Windows. Extra Linux/Unix/POSIX-only applications can
+## be declared by appending with `APPS += ...` afterwards.
+## See the get_app_list function in scripts/generate_visualc_files.pl and
+## make sure to check that it still works if you tweak the format here.
 APPS = \
-	aes/crypt_and_hash$(EXEXT) \
-	hash/generic_sum$(EXEXT) \
-	hash/hello$(EXEXT) \
-	pkey/dh_client$(EXEXT) \
-	pkey/dh_genprime$(EXEXT) \
-	pkey/dh_server$(EXEXT) \
-	pkey/ecdh_curve25519$(EXEXT) \
-	pkey/ecdsa$(EXEXT) \
-	pkey/gen_key$(EXEXT) \
-	pkey/key_app$(EXEXT) \
-	pkey/key_app_writer$(EXEXT) \
-	pkey/mpi_demo$(EXEXT) \
-	pkey/pk_decrypt$(EXEXT) \
-	pkey/pk_encrypt$(EXEXT) \
-	pkey/pk_sign$(EXEXT) \
-	pkey/pk_verify$(EXEXT) \
-	pkey/rsa_decrypt$(EXEXT) \
-	pkey/rsa_encrypt$(EXEXT) \
-	pkey/rsa_genkey$(EXEXT) \
-	pkey/rsa_sign$(EXEXT) \
-	pkey/rsa_sign_pss$(EXEXT) \
-	pkey/rsa_verify$(EXEXT) \
-	pkey/rsa_verify_pss$(EXEXT) \
-	psa/crypto_examples$(EXEXT) \
-	psa/key_ladder_demo$(EXEXT) \
-	psa/psa_constant_names$(EXEXT) \
-	random/gen_entropy$(EXEXT) \
-	random/gen_random_ctr_drbg$(EXEXT) \
-	ssl/dtls_client$(EXEXT) \
-	ssl/dtls_server$(EXEXT) \
-	ssl/mini_client$(EXEXT) \
-	ssl/ssl_client1$(EXEXT) \
-	ssl/ssl_client2$(EXEXT) \
-	ssl/ssl_context_info$(EXEXT) \
-	ssl/ssl_fork_server$(EXEXT) \
-	ssl/ssl_mail_client$(EXEXT) \
-	ssl/ssl_server$(EXEXT) \
-	ssl/ssl_server2$(EXEXT) \
-	test/benchmark$(EXEXT) \
-	test/query_compile_time_config$(EXEXT) \
-	test/selftest$(EXEXT) \
-	test/udp_proxy$(EXEXT) \
-	test/zeroize$(EXEXT) \
-	util/pem2der$(EXEXT) \
-	util/strerror$(EXEXT) \
-	x509/cert_app$(EXEXT) \
-	x509/cert_req$(EXEXT) \
-	x509/cert_write$(EXEXT) \
-	x509/crl_app$(EXEXT) \
-	x509/req_app$(EXEXT) \
+	aes/crypt_and_hash \
+	hash/generic_sum \
+	hash/hello \
+	pkey/dh_client \
+	pkey/dh_genprime \
+	pkey/dh_server \
+	pkey/ecdh_curve25519 \
+	pkey/ecdsa \
+	pkey/gen_key \
+	pkey/key_app \
+	pkey/key_app_writer \
+	pkey/mpi_demo \
+	pkey/pk_decrypt \
+	pkey/pk_encrypt \
+	pkey/pk_sign \
+	pkey/pk_verify \
+	pkey/rsa_decrypt \
+	pkey/rsa_encrypt \
+	pkey/rsa_genkey \
+	pkey/rsa_sign \
+	pkey/rsa_sign_pss \
+	pkey/rsa_verify \
+	pkey/rsa_verify_pss \
+	psa/crypto_examples \
+	psa/key_ladder_demo \
+	psa/psa_constant_names \
+	random/gen_entropy \
+	random/gen_random_ctr_drbg \
+	ssl/dtls_client \
+	ssl/dtls_server \
+	ssl/mini_client \
+	ssl/ssl_client1 \
+	ssl/ssl_client2 \
+	ssl/ssl_context_info \
+	ssl/ssl_fork_server \
+	ssl/ssl_mail_client \
+	ssl/ssl_server \
+	ssl/ssl_server2 \
+	test/benchmark \
+	test/query_compile_time_config \
+	test/selftest \
+	test/udp_proxy \
+	test/zeroize \
+	util/pem2der \
+	util/strerror \
+	x509/cert_app \
+	x509/cert_req \
+	x509/cert_write \
+	x509/crl_app \
+	x509/req_app \
 # End of APPS
 
 ifdef PTHREAD
-APPS +=	ssl/ssl_pthread_server$(EXEXT)
+APPS +=	ssl/ssl_pthread_server
 endif
 
 ifdef TEST_CPP
-APPS += test/cpp_dummy_build$(EXEXT)
+APPS += test/cpp_dummy_build
 endif
 
+EXES = $(patsubst %,%$(EXEXT),$(APPS))
+
 .SILENT:
 
 .PHONY: all clean list fuzz
 
-all: $(APPS)
+all: $(EXES)
 ifndef WINDOWS
 # APPS doesn't include the fuzzing programs, which aren't "normal"
 # sample or test programs, and don't build with MSVC which is
@@ -382,7 +389,7 @@
 
 clean:
 ifndef WINDOWS
-	rm -f $(APPS)
+	rm -f $(EXES)
 	-rm -f ssl/ssl_pthread_server$(EXEXT)
 	-rm -f test/cpp_dummy_build$(EXEXT)
 else
@@ -399,4 +406,4 @@
 endif
 
 list:
-	echo $(APPS)
+	echo $(EXES)
diff --git a/scripts/generate_visualc_files.pl b/scripts/generate_visualc_files.pl
index d11041c..f325e9a 100755
--- a/scripts/generate_visualc_files.pl
+++ b/scripts/generate_visualc_files.pl
@@ -177,10 +177,10 @@
 }
 
 sub get_app_list {
-    my $app_list = `cd $programs_dir && make list`;
-    die "make list failed: $!\n" if $?;
-
-    return split /\s+/, $app_list;
+    my $makefile_contents = slurp_file('programs/Makefile');
+    $makefile_contents =~ /\n\s*APPS\s*=[\\\s]*(.*?)(?<!\\)[\#\n]/s
+      or die "Cannot find APPS = ... in programs/Makefile\n";
+    return split /(?:\s|\\)+/, $1;
 }
 
 sub gen_app_files {