How to maintain code generator parallelism in cross-builds?

So here’s a build scenario I’m trying to work through… I’m building N distinct code generators each producing one of N different sources. Everything works as expected when compiling for host. However,

  1. The code generators are very slow when run through an emulator, so cross-compiling everything with a single toolchain is no good.
  2. Doing an export + find_package dance breaks parallelism between building the code generators and building their outputs (and other things in the cross build).
  3. The approach in (2) requires manually rerunning two builds during development (instead of just one), which is tedious.
  4. Using ExternalProject solves (3), but:
    a. The superbuild binary directory does the wrong thing when running ctest or cmake --install, and
    b. It still doesn’t solve the parallelism issue.

Does anyone know of an approach that works just as well for cross-builds as it does for host-builds?

I was able to solve (4a) with the following shims:

##
# Create shims to make the super-build directory behave like the cross-build directory

# Don't let CMake generate a cmake_install.cmake file
set(CMAKE_SKIP_INSTALL_RULES YES)

ExternalProject_Get_Property(cross-build BINARY_DIR)
file(CONFIGURE OUTPUT "cmake_install.cmake"
     CONTENT [[include("${BINARY_DIR}/cmake_install.cmake")]])

# Don't let CMake generate a CTestTestfile.cmake file (don't uncomment!)
# enable_testing()

file(RELATIVE_PATH ctest_dir "${CMAKE_CURRENT_BINARY_DIR}" "${BINARY_DIR}")
file(CONFIGURE OUTPUT "CTestTestfile.cmake"
     CONTENT [[subdirs("${ctest_dir}")]])