Incompatible compatible number interface properties do not fail

Hello!

I’m trying to use Compatible Interface Properties to forbid people linking to 2 incompatible versions of my library.
COMPATIBLE_INTERFACE_NUMBER_MAX and COMPATIBLE_INTERFACE_NUMBER_MIN look ideal for this.

The issue I’m facing is that the CMake script below does not fail to configure when configuring with -DADD_COMPATIBLE_INTERFACE_NUMBERS=ON -DADD_COMPATIBLE_INTERFACE_BOOLS=OFF.
Passing -DADD_COMPATIBLE_INTERFACE_BOOLS=OFF makes it succesfully fail, but that’s not a good solution.
(the script assumes you have installed libsdl2-dev/SDL2-devel on a Linux system)

What am I doing wrong?

cmake_minimum_required(VERSION 3.25)
project(test_compatible_interface_properties C)

find_library(SDL2_LIBRARY NAMES SDL2 REQUIRED)
find_path(SDL2_INCLUDE_PATH NAMES SDL.h SUBDIRS SDL2 REQUIRED)

option(ADD_COMPATIBLE_INTERFACE_NUMBERS "Use COMPATIBLE_INTERFACE_NUMBER_MIN and COMPATIBLE_INTERFACE_NUMBER_MAX" ON)
option(ADD_COMPATIBLE_INTERFACE_BOOLS "Use COMPATIBLE_INTERFACE_BOOL" OFF)

# Create imported SDL2::SDL2 target for SDL2
add_library(SDL2::SDL2 SHARED IMPORTED)
set_target_properties(SDL2::SDL2 PROPERTIES
  IMPORTED_LOCATION "${SDL2_LIBRARY}"
  INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INCLUDE_PATH};${SDL2_INCLUDE_PATH}/SDL2"
)
if(ADD_COMPATIBLE_INTERFACE_NUMBERS)
  set_target_properties(SDL2::SDL2 PROPERTIES
    COMPATIBLE_INTERFACE_NUMBER_MIN SDL_VERSION_MAJOR_MIN
    INTERFACE_SDL_VERSION_MAJOR_MIN "2"
    COMPATIBLE_INTERFACE_NUMBER_MAX SDL_VERSION_MAJOR_MAX
    INTERFACE_SDL_VERSION_MAJOR_MAX "2"
  )
endif()
if(ADD_COMPATIBLE_INTERFACE_BOOLS)
  set_target_properties(SDL2::SDL2 PROPERTIES
    COMPATIBLE_INTERFACE_BOOL "SDL_VERSION_IS_2"
    INTERFACE_SDL_VERSION_IS_2 "TRUE"
  )
endif()

# Create imported SDL3::SDL3 target for SDL3.
# Since SDL3 has net yet been released, re-use SDL2.
add_library(SDL3::SDL3 SHARED IMPORTED)
set_target_properties(SDL3::SDL3 PROPERTIES
  IMPORTED_LOCATION "${SDL2_LIBRARY}"
  INTERFACE_INCLUDE_DIRECTORIES "${SDL2_INCLUDE_PATH};${SDL2_INCLUDE_PATH}/SDL2"
)

if(ADD_COMPATIBLE_INTERFACE_NUMBERS)
  set_target_properties(SDL3::SDL3 PROPERTIES
    COMPATIBLE_INTERFACE_NUMBER_MIN SDL_VERSION_MAJOR_MIN
    INTERFACE_SDL_VERSION_MAJOR_MIN "3"
    COMPATIBLE_INTERFACE_NUMBER_MAX SDL_VERSION_MAJOR_MAX
    INTERFACE_SDL_VERSION_MAJOR_MAX "3"
  )
endif()
if(ADD_COMPATIBLE_INTERFACE_BOOLS)
  set_target_properties(SDL3::SDL3 PROPERTIES
    COMPATIBLE_INTERFACE_BOOL "SDL_VERSION_IS_2"
    INTERFACE_SDL_VERSION_IS_2 "FALSE"
  )
endif()

file(WRITE main.c [[
#include "SDL.h"

int main(int argc, char *argv[]) {
 SDL_Init(SDL_INIT_EVERYTHING);
 SDL_Quit();
 return 0;
}
]])

add_executable(main main.c)
target_link_libraries(main PRIVATE SDL2::SDL2 SDL3::SDL3)

Replying to my own question.

It looks like compatible number interface properties are useful for dynamically calculating the minimum/maximum properties.
Adding

target_compile_definitions(main PRIVATE sdl_min=$<TARGET_PROPERTY:SDL_VERSION_MAJOR_MIN> sdl_max=$<TARGET_PROPERTY:SDL_VERSION_MAJOR_MAX>)

would add -Dsdl_min=2 -DSDL_max=3 as compile options.

For my use case I need to use COMPATIBLE_INTERFACE_STRING instead.

set_target_properties(SDL2::SDL2 PROPERTIES
  COMPATIBLE_INTERFACE_STRING SDL_VERSION
  INTERFACE_SDL_VERSION "SDL2"
)
set_target_properties(SDL3::SDL3 PROPERTIES
  COMPATIBLE_INTERFACE_STRING SDL_VERSION
  INTERFACE_SDL_VERSION "SDL3"
)