enable_language(C) if (NOT CMAKE_C_CREATE_PREPROCESSED_SOURCE) return() endif() if (NOT CMAKE_C_DEFINE_FLAG) set(CMAKE_C_DEFINE_FLAG "-D") endif() # clean-up the command line string(REPLACE "${CMAKE_START_TEMP_FILE}" "" create_preprocessed_source "${CMAKE_C_CREATE_PREPROCESSED_SOURCE}") string(REPLACE "${CMAKE_END_TEMP_FILE}" "" create_preprocessed_source "${create_preprocessed_source}") string(REPLACE "" "" create_preprocessed_source "${create_preprocessed_source}") separate_arguments(create_preprocessed_source UNIX_COMMAND "${create_preprocessed_source}") add_custom_rule(preprocess OUTPUT /.c COMMAND "${CMAKE_COMMAND}" -E make_directory "" COMMAND ${create_preprocessed_source}) # Use RULE_PATTERNS file set property add_library(foo1 STATIC) target_sources(foo1 PRIVATE FILE_SET fs TYPE preprocess FILES file1.c) set_property(FILE_SET fs TARGET foo1 PROPERTY RULE_PATTERNS "INPUT=$>;OUTPUT_DIR=/;CMAKE_C_COMPILER=${CMAKE_C_COMPILER};PREPROCESSED_SOURCE=$/.c>;INCLUDES=;DEFINES=${CMAKE_C_DEFINE_FLAG}RULE_PATTERN=1;FLAGS=") # Use _PATTERNS source file property add_library(foo2 STATIC) target_sources(foo2 PRIVATE FILE_SET fs TYPE preprocess FILES file1.c) set_property(SOURCE file1.c TARGET_DIRECTORY foo2 PROPERTY preprocess_PATTERNS "INPUT=$>;OUTPUT_DIR=/;CMAKE_C_COMPILER=${CMAKE_C_COMPILER};PREPROCESSED_SOURCE=$/.c>;INCLUDES=;DEFINES=${CMAKE_C_DEFINE_FLAG}RULE_PATTERN=1;FLAGS=") # _PATTERNS source file property override RULE_PATTERNS file set property add_library(foo3 STATIC) target_sources(foo3 PRIVATE FILE_SET fs TYPE preprocess FILES file1.c) set_property(FILE_SET fs TARGET foo3 PROPERTY RULE_PATTERNS "DEFINES=${CMAKE_C_DEFINE_FLAG}WRONG=1")