diff --git a/CMakeModules/SetupFGFSEmbeddedResources.cmake b/CMakeModules/SetupFGFSEmbeddedResources.cmake
new file mode 100644
index 000000000..c06887a35
--- /dev/null
+++ b/CMakeModules/SetupFGFSEmbeddedResources.cmake
@@ -0,0 +1,29 @@
+function(setup_fgfs_embedded_resources)
+    # The source and header files.
+    set(SOURCES
+        ${CMAKE_BINARY_DIR}/src/EmbeddedResources/FlightGear-resources.cxx
+    )
+    set(HEADERS
+        ${CMAKE_BINARY_DIR}/src/EmbeddedResources/FlightGear-resources.hxx
+    )
+    set_property(GLOBAL APPEND PROPERTY EMBEDDED_RESOURCE_SOURCES ${SOURCES})
+    set_property(GLOBAL APPEND PROPERTY EMBEDDED_RESOURCE_HEADERS ${HEADERS})
+
+    # On Windows, make sure fgrcc can be run (it needs third-party libraries)
+    if(MSVC)
+      if(MSVC_3RDPARTY_ROOT AND MSVC_3RDPARTY_DIR)
+        set(CMAKE_MSVCIDE_RUN_PATH ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/bin)
+      else()
+        message(FATAL_ERROR
+          "Either MSVC_3RDPARTY_ROOT or MSVC_3RDPARTY_DIR is empty or unset")
+      endif()
+    endif()
+
+    add_custom_command(
+      OUTPUT ${CMAKE_BINARY_DIR}/src/EmbeddedResources/FlightGear-resources.cxx
+             ${CMAKE_BINARY_DIR}/src/EmbeddedResources/FlightGear-resources.hxx
+      COMMAND fgrcc --root=${CMAKE_SOURCE_DIR} --output-cpp-file=${CMAKE_BINARY_DIR}/src/EmbeddedResources/FlightGear-resources.cxx --init-func-name=initFlightGearEmbeddedResources --output-header-file=${CMAKE_BINARY_DIR}/src/EmbeddedResources/FlightGear-resources.hxx --output-header-identifier=_FG_FLIGHTGEAR_EMBEDDED_RESOURCES ${CMAKE_SOURCE_DIR}/src/EmbeddedResources/FlightGear-resources.xml
+      DEPENDS
+        fgrcc ${CMAKE_SOURCE_DIR}/src/EmbeddedResources/FlightGear-resources.xml
+    )
+endfunction()
diff --git a/src/Main/CMakeLists.txt b/src/Main/CMakeLists.txt
index 34a5fdce1..9c86605e8 100644
--- a/src/Main/CMakeLists.txt
+++ b/src/Main/CMakeLists.txt
@@ -1,4 +1,5 @@
 # CMake module includes.
+include(SetupFGFSEmbeddedResources)
 include(SetupFGFSLibraries)
 
 if(MSVC)
@@ -24,7 +25,6 @@ set(SOURCES
     subsystemFactory.cxx
     util.cxx
     ${RESOURCE_FILE}
-    ${CMAKE_BINARY_DIR}/src/EmbeddedResources/FlightGear-resources.cxx
 )
 
 set(HEADERS
@@ -43,29 +43,16 @@ set(HEADERS
     screensaver_control.hxx
     subsystemFactory.hxx
     util.hxx
-    ${CMAKE_BINARY_DIR}/src/EmbeddedResources/FlightGear-resources.hxx
 )
 
-# On Windows, make sure fgrcc can be run (it needs third-party libraries)
-if(MSVC)
-  if(MSVC_3RDPARTY_ROOT AND MSVC_3RDPARTY_DIR)
-    set(CMAKE_MSVCIDE_RUN_PATH ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/bin)
-  else()
-    message(FATAL_ERROR
-      "Either MSVC_3RDPARTY_ROOT or MSVC_3RDPARTY_DIR is empty or unset")
-  endif()
-endif()
-
-add_custom_command(
-  OUTPUT ${CMAKE_BINARY_DIR}/src/EmbeddedResources/FlightGear-resources.cxx
-         ${CMAKE_BINARY_DIR}/src/EmbeddedResources/FlightGear-resources.hxx
-  COMMAND fgrcc --root=${CMAKE_SOURCE_DIR} --output-cpp-file=${CMAKE_BINARY_DIR}/src/EmbeddedResources/FlightGear-resources.cxx --init-func-name=initFlightGearEmbeddedResources --output-header-file=${CMAKE_BINARY_DIR}/src/EmbeddedResources/FlightGear-resources.hxx --output-header-identifier=_FG_FLIGHTGEAR_EMBEDDED_RESOURCES ${CMAKE_SOURCE_DIR}/src/EmbeddedResources/FlightGear-resources.xml
-  DEPENDS
-    fgrcc ${CMAKE_SOURCE_DIR}/src/EmbeddedResources/FlightGear-resources.xml
-)
+# Set up the embedded resources.
+setup_fgfs_embedded_resources()
 
+# All sources and headers to be built into fgfs.
 get_property(FG_SOURCES GLOBAL PROPERTY FG_SOURCES)
 get_property(FG_HEADERS GLOBAL PROPERTY FG_HEADERS)
+get_property(EMBEDDED_RESOURCE_SOURCES GLOBAL PROPERTY EMBEDDED_RESOURCE_SOURCES)
+get_property(EMBEDDED_RESOURCE_HEADERS GLOBAL PROPERTY EMBEDDED_RESOURCE_HEADERS)
 
 get_property(FG_GROUPS_C GLOBAL PROPERTY FG_GROUPS_C)
 string(REPLACE "@" ";" groups ${FG_GROUPS_C} )
@@ -92,8 +79,16 @@ source_group("Main\\Sources" FILES ${SOURCES})
 # platforms ignore this option. If a console is needed we allocate
 # it manually via AllocConsole()
 # similarly pass MACOSX_BUNDLE so we generate a .app on Mac
-add_executable(fgfs WIN32 MACOSX_BUNDLE
-               ${SOURCES} ${FG_SOURCES} ${FG_HEADERS} ${HEADERS})
+add_executable(fgfs
+    WIN32
+    MACOSX_BUNDLE
+    ${SOURCES}
+    ${HEADERS}
+    ${FG_SOURCES}
+    ${FG_HEADERS}
+    ${EMBEDDED_RESOURCE_SOURCES}
+    ${EMBEDDED_RESOURCE_HEADERS}
+)
 
 #-----------------------------------------------------------------------------
 # MacOSX bundle packaging
diff --git a/test_suite/CMakeLists.txt b/test_suite/CMakeLists.txt
index 36e6cc6c7..6d6ef34f3 100644
--- a/test_suite/CMakeLists.txt
+++ b/test_suite/CMakeLists.txt
@@ -1,4 +1,5 @@
 # CMake module includes.
+include(SetupFGFSEmbeddedResources)
 include(SetupFGFSLibraries)
 
 # Add each test suite category.
@@ -100,7 +101,6 @@ set(MAIN_SOURCES
     ${PROJECT_SOURCE_DIR}/src/Main/subsystemFactory.cxx
     ${PROJECT_SOURCE_DIR}/src/Main/util.cxx
     ${RESOURCE_FILE}
-    ${CMAKE_BINARY_DIR}/src/EmbeddedResources/FlightGear-resources.cxx
 )
 
 set(MAIN_HEADERS
@@ -119,30 +119,16 @@ set(MAIN_HEADERS
     ${PROJECT_SOURCE_DIR}/src/Main/screensaver_control.hxx
     ${PROJECT_SOURCE_DIR}/src/Main/subsystemFactory.hxx
     ${PROJECT_SOURCE_DIR}/src/Main/util.hxx
-    ${CMAKE_BINARY_DIR}/src/EmbeddedResources/FlightGear-resources.hxx
 )
 
-# On Windows, make sure fgrcc can be run (it needs third-party libraries)
-if(MSVC)
-  if(MSVC_3RDPARTY_ROOT AND MSVC_3RDPARTY_DIR)
-    set(CMAKE_MSVCIDE_RUN_PATH ${MSVC_3RDPARTY_ROOT}/${MSVC_3RDPARTY_DIR}/bin)
-  else()
-    message(FATAL_ERROR
-      "Either MSVC_3RDPARTY_ROOT or MSVC_3RDPARTY_DIR is empty or unset")
-  endif()
-endif()
+# Set up the embedded resources.
+setup_fgfs_embedded_resources()
 
-add_custom_command(
-  OUTPUT ${CMAKE_BINARY_DIR}/src/EmbeddedResources/FlightGear-resources.cxx
-         ${CMAKE_BINARY_DIR}/src/EmbeddedResources/FlightGear-resources.hxx
-  COMMAND fgrcc --root=${CMAKE_SOURCE_DIR} --output-cpp-file=${CMAKE_BINARY_DIR}/src/EmbeddedResources/FlightGear-resources.cxx --init-func-name=initFlightGearEmbeddedResources --output-header-file=${CMAKE_BINARY_DIR}/src/EmbeddedResources/FlightGear-resources.hxx --output-header-identifier=_FG_FLIGHTGEAR_EMBEDDED_RESOURCES ${CMAKE_SOURCE_DIR}/src/EmbeddedResources/FlightGear-resources.xml
-  DEPENDS
-    fgrcc ${CMAKE_SOURCE_DIR}/src/EmbeddedResources/FlightGear-resources.xml
-)
-
-# Get the FG sources and headers to be built into the test suite.
+# All sources and headers to be built into the test suite.
 get_property(FG_SOURCES GLOBAL PROPERTY FG_SOURCES)
 get_property(FG_HEADERS GLOBAL PROPERTY FG_HEADERS)
+get_property(EMBEDDED_RESOURCE_SOURCES GLOBAL PROPERTY EMBEDDED_RESOURCE_SOURCES)
+get_property(EMBEDDED_RESOURCE_HEADERS GLOBAL PROPERTY EMBEDDED_RESOURCE_HEADERS)
 
 # Set up the source groups.
 get_property(FG_GROUPS_C GLOBAL PROPERTY FG_GROUPS_C)
@@ -171,6 +157,8 @@ source_group("Main\\Sources" FILES ${SOURCES})
 add_executable(run_test_suite
     ${FG_SOURCES}
     ${FG_HEADERS}
+    ${EMBEDDED_RESOURCE_SOURCES}
+    ${EMBEDDED_RESOURCE_HEADERS}
     ${MAIN_SOURCES}
     ${MAIN_HEADERS}
     ${TESTSUITE_SOURCES}