$<COMPILE_LANG_AND_ID:lang,id> may not be used with file(GENERATE) -- breaks some existing CMakeLists
Various bits of CMake in-the-wild write out files -- often pkg-config files -- that contain generator expressions in the variables substituted into the files. Sometimes that uses one stage (a single configure_file()
or file(GENERATE)
) and sometimes two (a configure_file()
to substitute in variables, and a file(GENERATE)
to do expansion). This fails with a message like this:
CMake Error at cmake/Modules/GeneratePkgConfig.cmake:181 (file):
Error evaluating generator expression:
$<COMPILE_LANG_AND_ID:CUDA,NVIDIA>
$<COMPILE_LANG_AND_ID:lang,id> may only be used with binary targets to
specify include directories, compile definitions, and compile options. It
may not be used with the add_custom_command, add_custom_target, or
file(GENERATE) commands.
Call Stack (most recent call first):
CMakeLists.txt:747 (generate_and_install_pkg_config_file)
This affects:
- libtorrent (https://github.com/arvidn/libtorrent/)
- folly (https://github.com/facebook/folly/)
I've filed an upstream (?) issue https://github.com/facebook/folly/issues/1414 as well.
I see that in 3.17.2, COMPILE_LANG_AND_ID already existed with the same restrictions, so the "new" thing is, that it is leaking into compiler flags that existing projects were writing to pkg-config files.