Generator Expression using Custom Configuration Name

I am working with the Visual Studio Generator. I created custom configuration types using -DCMAKE_CONFIGURATION_TYPES="Custom-1;Custom-2" when calling CMAKE. My CMAKELISTS.txt uses the config type like this:

set(Var1 $<$<CONFIG:Custom-1>:Custom1Var><$<$<CONFIG:Custom-2>:Custom2Var>)

However, when I generate, I get errors saying

Error Evaluating generator Expression: $<CONFIG:Custom-1>.

I have checked that the CMAKE_CONFIGURATION_TYPES variable is set correctly. I am using CMAKE 3.15.7.

What am I doing incorrectly?

Thanks!

Do you still get the error if you replace the hyphens (-) with underscores (_) in your configuration names?

I do not get the error.

However, I would like it to be a hyphen, is this not do-able?

Apparently not. I’m not aware of - being special in generator expressions… There may, however, be old assumptions/enforcements around configuration names lingering around (e.g., it is called RelWithDebInfo because old(?) Visual Studio would do “substr” matches instead of == matches and requesting Release could find any of Release, ReleaseMinimumSize, or ReleaseWithDebug depending on ordering).

@brad.king?

The expression in the description is malformed, but I suspect that is just a typo in transcribing from your real project. You have a stray < in the middle. It should be:

set(Var1 $<$<CONFIG:Custom-1>:Custom1Var>$<$<CONFIG:Custom-2>:Custom2Var>)

I think the regular expression on this line is the reason hyphens in configuration names are not supported in generator expressions. Adding a hyphen to that regular expression allows your example to work (after fixing the malformed part mentioned above). I don’t know if that’s a safe change in general or whether other places also don’t support a hyphen in a config name. It probably needs a deeper analysis than I have the time to available to dedicate right now. Hopefully this gives enough clues to someone else who might be able to do a deeper analysis.

In general we expect configuration names to be valid C identifiers. This minimizes the chance that some tool or file format doesn’t handle them correctly.

1 Like