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)