Introduce "Dev mode" option

When the option is On, CMake will have rules to generate the generated
files using scripts etc. When the option is Off, CMake will assume the
files are available from the source tree; in that mode, it won't require
any extra tools (Perl for example) compared to when we committed the
files to git.

The intention is that users will never need to adjust this option:

- in the development branch (and features branches etc.) the option is
always On (development mode);
- in released tarballs, which include the generated files, we'll switch
the option to Off (release mode) in the same commit that re-adds the
generated files.

Signed-off-by: Manuel Pégourié-Gonnard <manuel.pegourie-gonnard@arm.com>
diff --git a/programs/psa/CMakeLists.txt b/programs/psa/CMakeLists.txt
index 01bd687..c5d0d28 100644
--- a/programs/psa/CMakeLists.txt
+++ b/programs/psa/CMakeLists.txt
@@ -4,20 +4,24 @@
     psa_constant_names
 )
 
-add_custom_command(
-    OUTPUT
-        ${CMAKE_CURRENT_BINARY_DIR}/psa_constant_names_generated.c
-    COMMAND
-        ${PYTHON}
+if(DEV_MODE)
+    add_custom_command(
+        OUTPUT
+            ${CMAKE_CURRENT_BINARY_DIR}/psa_constant_names_generated.c
+        COMMAND
+            ${PYTHON}
+                ${CMAKE_CURRENT_SOURCE_DIR}/../../scripts/generate_psa_constants.py
+                ${CMAKE_CURRENT_BINARY_DIR}
+        WORKING_DIRECTORY
+            ${CMAKE_CURRENT_SOURCE_DIR}/../..
+        DEPENDS
             ${CMAKE_CURRENT_SOURCE_DIR}/../../scripts/generate_psa_constants.py
-            ${CMAKE_CURRENT_BINARY_DIR}
-    WORKING_DIRECTORY
-        ${CMAKE_CURRENT_SOURCE_DIR}/../..
-    DEPENDS
-        ${CMAKE_CURRENT_SOURCE_DIR}/../../scripts/generate_psa_constants.py
-        ${CMAKE_CURRENT_SOURCE_DIR}/../../include/psa/crypto_values.h
-        ${CMAKE_CURRENT_SOURCE_DIR}/../../include/psa/crypto_extra.h
-)
+            ${CMAKE_CURRENT_SOURCE_DIR}/../../include/psa/crypto_values.h
+            ${CMAKE_CURRENT_SOURCE_DIR}/../../include/psa/crypto_extra.h
+    )
+else()
+    link_to_source(psa_constant_names_generated.c)
+endif()
 
 foreach(exe IN LISTS executables)
     add_executable(${exe} ${exe}.c $<TARGET_OBJECTS:mbedtls_test>)
@@ -26,9 +30,11 @@
 endforeach()
 
 target_include_directories(psa_constant_names PRIVATE ${CMAKE_CURRENT_BINARY_DIR})
-add_custom_target(generate_psa_constant_names_generated_c
-    DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/psa_constant_names_generated.c)
-add_dependencies(psa_constant_names generate_psa_constant_names_generated_c)
+if(DEV_MODE)
+    add_custom_target(generate_psa_constant_names_generated_c
+        DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/psa_constant_names_generated.c)
+    add_dependencies(psa_constant_names generate_psa_constant_names_generated_c)
+endif()
 
 install(TARGETS ${executables}
         DESTINATION "bin"
diff --git a/programs/ssl/CMakeLists.txt b/programs/ssl/CMakeLists.txt
index a14e264..e8d2865 100644
--- a/programs/ssl/CMakeLists.txt
+++ b/programs/ssl/CMakeLists.txt
@@ -18,14 +18,16 @@
     ssl_server2
 )
 
-# Inform CMake the the following file will be generated as part of the build
-# process, so it doesn't complain that it doesn't exist yet. Starting from
-# CMake 3.20, this will no longer be necessary as CMake will automatically
-# propagate this information accross the tree, for now it's only visible
-# inside the same directory, so we need to propagate manually.
-set_source_files_properties(
-    ${CMAKE_CURRENT_BINARY_DIR}/../test/query_config.c
-    PROPERTIES GENERATED TRUE)
+if(DEV_MODE)
+    # Inform CMake the the following file will be generated as part of the build
+    # process, so it doesn't complain that it doesn't exist yet. Starting from
+    # CMake 3.20, this will no longer be necessary as CMake will automatically
+    # propagate this information accross the tree, for now it's only visible
+    # inside the same directory, so we need to propagate manually.
+    set_source_files_properties(
+        ${CMAKE_CURRENT_BINARY_DIR}/../test/query_config.c
+        PROPERTIES GENERATED TRUE)
+endif()
 
 foreach(exe IN LISTS executables)
     set(extra_sources "")
@@ -40,7 +42,9 @@
     target_link_libraries(${exe} ${libs})
     target_include_directories(${exe} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../../tests/include)
     if(exe STREQUAL "ssl_client2" OR exe STREQUAL "ssl_server2")
-        add_dependencies(${exe} generate_query_config_c)
+        if(DEV_MODE)
+            add_dependencies(${exe} generate_query_config_c)
+        endif()
         target_include_directories(${exe}
             PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/../test)
     endif()
diff --git a/programs/test/CMakeLists.txt b/programs/test/CMakeLists.txt
index 8193124..053b03c 100644
--- a/programs/test/CMakeLists.txt
+++ b/programs/test/CMakeLists.txt
@@ -27,26 +27,30 @@
     target_link_libraries(cpp_dummy_build ${mbedcrypto_target})
 endif()
 
-find_package(Perl REQUIRED)
+if(DEV_MODE)
+    find_package(Perl REQUIRED)
 
-add_custom_command(
-    OUTPUT
-        ${CMAKE_CURRENT_BINARY_DIR}/query_config.c
-    COMMAND
-        ${PERL}
+    add_custom_command(
+        OUTPUT
+            ${CMAKE_CURRENT_BINARY_DIR}/query_config.c
+        COMMAND
+            ${PERL}
+                ${CMAKE_CURRENT_SOURCE_DIR}/../../scripts/generate_query_config.pl
+                ${CMAKE_CURRENT_SOURCE_DIR}/../../include/mbedtls/mbedtls_config.h
+                ${CMAKE_CURRENT_SOURCE_DIR}/../../scripts/data_files/query_config.fmt
+                ${CMAKE_CURRENT_BINARY_DIR}/query_config.c
+        DEPENDS
             ${CMAKE_CURRENT_SOURCE_DIR}/../../scripts/generate_query_config.pl
             ${CMAKE_CURRENT_SOURCE_DIR}/../../include/mbedtls/mbedtls_config.h
             ${CMAKE_CURRENT_SOURCE_DIR}/../../scripts/data_files/query_config.fmt
-            ${CMAKE_CURRENT_BINARY_DIR}/query_config.c
-    DEPENDS
-        ${CMAKE_CURRENT_SOURCE_DIR}/../../scripts/generate_query_config.pl
-        ${CMAKE_CURRENT_SOURCE_DIR}/../../include/mbedtls/mbedtls_config.h
-        ${CMAKE_CURRENT_SOURCE_DIR}/../../scripts/data_files/query_config.fmt
-)
-# this file will also be used in anoter directory, so create a target, see
-# https://gitlab.kitware.com/cmake/community/-/wikis/FAQ#how-can-i-add-a-dependency-to-a-source-file-which-is-generated-in-a-subdirectory
-add_custom_target(generate_query_config_c
-    DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/query_config.c)
+    )
+    # this file will also be used in anoter directory, so create a target, see
+    # https://gitlab.kitware.com/cmake/community/-/wikis/FAQ#how-can-i-add-a-dependency-to-a-source-file-which-is-generated-in-a-subdirectory
+    add_custom_target(generate_query_config_c
+        DEPENDS ${CMAKE_CURRENT_BINARY_DIR}/query_config.c)
+else()
+    link_to_source(query_config.c)
+endif()
 
 foreach(exe IN LISTS executables_libs executables_mbedcrypto)
     set(extra_sources "")