cmake_minimum_required(VERSION 2.8.4) project(VSResource) string(REPLACE "/INCREMENTAL:YES" "" CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG}") message(STATUS "CMAKE_RC_COMPILER='${CMAKE_RC_COMPILER}'") # Because of the following avoidance techniques required for windres and VS6, # we recommend using a configured header file, and defining preprocessor # symbols via #define code and including that header in the rc file. Using # add_definitions is fine for simple definitions (with no spaces and no # quoting), but requires avoidance or work-arounds beyond that... if(CMAKE_RC_COMPILER MATCHES windres) # windres rc compiler does not properly define quoted /D values as strings message(STATUS "CMAKE_RC_COMPILER MATCHES windres") add_definitions(/DCMAKE_RCDEFINE=test.txt) add_definitions(/DCMAKE_RCDEFINE_NO_QUOTED_STRINGS) if(CMAKE_CURRENT_BINARY_DIR MATCHES " ") # windres cannot handle spaces in include dir set(CMAKE_RC_NO_INCLUDE 1) endif() elseif(MSVC60) # VS6 rc compiler does not deal well with spaces in a "/D" value, but it can # handle the quoting message(STATUS "MSVC60") add_definitions(/DCMAKE_RCDEFINE="test.txt") else() # expected case -- rc compiler is "capable enough" message(STATUS "rc compiler handles quoted strings with spaces in values via /D") set(TEXTFILE_FROM_SOURCE_DIR "textfile, spaces in name, from binary dir") configure_file(${CMAKE_CURRENT_SOURCE_DIR}/test.txt "${CMAKE_CURRENT_BINARY_DIR}/test with spaces.txt" @ONLY) add_definitions(/DCMAKE_RCDEFINE="test with spaces.txt") endif() if(CMAKE_RC_NO_INCLUDE) add_definitions(/DCMAKE_RC_NO_INCLUDE) else() configure_file(${CMAKE_CURRENT_SOURCE_DIR}/include.rc.in "${CMAKE_CURRENT_BINARY_DIR}/include.rc" @ONLY) include_directories(${CMAKE_CURRENT_BINARY_DIR}) endif() add_library(ResourceLib STATIC lib.cpp lib.rc) add_executable(VSResource main.cpp test.rc) target_link_libraries(VSResource ResourceLib) if(MSVC AND NOT MSVC_VERSION VERSION_LESS 1600) set_property(SOURCE test.rc PROPERTY COMPILE_FLAGS /nologo) endif() set_property(TARGET VSResource PROPERTY VS_GLOBAL_CMakeTestVsGlobalVariable "test val") if(CMAKE_GENERATOR MATCHES "Ninja|Visual Studio") cmake_policy(PUSH) cmake_policy(SET CMP0037 OLD) add_library("My ResourceLib" lib.cpp lib.rc) cmake_policy(POP) endif()