557aef0b94
The external project's build process may generate byproducts on which other rules in the driving project's build later depend. Provide a way for the driving project to specify what byproducts it expects to be made available by the custom commands that drive the external project.
128 lines
4.2 KiB
CMake
128 lines
4.2 KiB
CMake
cmake_minimum_required(VERSION 3.1)
|
|
project(CustomCommandByproducts C)
|
|
|
|
# Generate a byproduct in a rule that runs in the target consuming it.
|
|
add_custom_command(
|
|
OUTPUT timestamp1.txt
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
|
${CMAKE_CURRENT_SOURCE_DIR}/byproduct1.c.in byproduct1.c
|
|
BYPRODUCTS byproduct1.c
|
|
COMMAND ${CMAKE_COMMAND} -E touch timestamp1.txt
|
|
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/byproduct1.c.in
|
|
)
|
|
|
|
# Generate a byproduct in a rule that runs in a dependency of the consumer.
|
|
add_custom_command(
|
|
OUTPUT timestamp2.txt
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
|
${CMAKE_CURRENT_SOURCE_DIR}/byproduct2.c.in byproduct2.c
|
|
BYPRODUCTS byproduct2.c
|
|
COMMAND ${CMAKE_COMMAND} -E touch timestamp2.txt
|
|
DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/byproduct2.c.in
|
|
)
|
|
add_custom_target(Producer2 DEPENDS timestamp2.txt)
|
|
|
|
# Generate a byproduct in a custom target.
|
|
add_custom_target(Producer3_4
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
|
${CMAKE_CURRENT_SOURCE_DIR}/byproduct3.c.in byproduct3.c
|
|
BYPRODUCTS byproduct3.c
|
|
)
|
|
|
|
# Generate a byproduct in a custom target POST_BUILD command.
|
|
add_custom_command(
|
|
TARGET Producer3_4 POST_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
|
${CMAKE_CURRENT_SOURCE_DIR}/byproduct4.c.in byproduct4.c
|
|
BYPRODUCTS byproduct4.c
|
|
)
|
|
|
|
add_executable(ProducerExe ProducerExe.c)
|
|
|
|
# Generate a byproduct in an executable POST_BUILD command.
|
|
add_custom_command(
|
|
TARGET ProducerExe POST_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
|
${CMAKE_CURRENT_SOURCE_DIR}/byproduct5.c.in byproduct5.c
|
|
BYPRODUCTS byproduct5.c
|
|
)
|
|
|
|
# Generate a byproduct in an executable PRE_LINK command.
|
|
add_custom_command(
|
|
TARGET ProducerExe PRE_LINK
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
|
${CMAKE_CURRENT_SOURCE_DIR}/byproduct6.c.in byproduct6.c
|
|
BYPRODUCTS byproduct6.c
|
|
)
|
|
|
|
# Generate a byproduct in an executable PRE_BUILD command.
|
|
add_custom_command(
|
|
TARGET ProducerExe PRE_BUILD
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
|
${CMAKE_CURRENT_SOURCE_DIR}/byproduct7.c.in byproduct7.c
|
|
BYPRODUCTS byproduct7.c
|
|
)
|
|
|
|
# Generate a byproduct in a custom command that consumes other byproducts.
|
|
add_custom_command(OUTPUT timestamp8.txt
|
|
COMMAND ${CMAKE_COMMAND} -E copy_if_different
|
|
${CMAKE_CURRENT_SOURCE_DIR}/byproduct8.c.in byproduct8.c
|
|
COMMAND ${CMAKE_COMMAND} -E touch timestamp8.txt
|
|
BYPRODUCTS byproduct8.c
|
|
DEPENDS
|
|
${CMAKE_CURRENT_BINARY_DIR}/byproduct2.c
|
|
${CMAKE_CURRENT_BINARY_DIR}/byproduct3.c
|
|
${CMAKE_CURRENT_BINARY_DIR}/byproduct4.c
|
|
${CMAKE_CURRENT_BINARY_DIR}/byproduct5.c
|
|
${CMAKE_CURRENT_BINARY_DIR}/byproduct6.c
|
|
${CMAKE_CURRENT_BINARY_DIR}/byproduct7.c
|
|
${CMAKE_CURRENT_SOURCE_DIR}/byproduct8.c.in
|
|
)
|
|
|
|
# Generate the library file of an imported target as a byproduct
|
|
# of an external project.
|
|
if(CMAKE_CONFIGURATION_TYPES)
|
|
set(cfg /${CMAKE_CFG_INTDIR})
|
|
else()
|
|
set(cfg)
|
|
endif()
|
|
set(ExternalLibrary_LIBRARY
|
|
${CMAKE_CURRENT_BINARY_DIR}/External-build${cfg}/${CMAKE_STATIC_LIBRARY_PREFIX}ExternalLibrary${CMAKE_STATIC_LIBRARY_SUFFIX}
|
|
)
|
|
include(ExternalProject)
|
|
ExternalProject_Add(ExternalTarget
|
|
SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/External"
|
|
BINARY_DIR "${CMAKE_CURRENT_BINARY_DIR}/External-build"
|
|
PREFIX "${CMAKE_CURRENT_BINARY_DIR}/External-build/root"
|
|
DOWNLOAD_COMMAND ""
|
|
INSTALL_COMMAND ""
|
|
BUILD_BYPRODUCTS "${ExternalLibrary_LIBRARY}"
|
|
)
|
|
add_library(ExternalLibrary STATIC IMPORTED)
|
|
set_property(TARGET ExternalLibrary PROPERTY IMPORTED_LOCATION ${ExternalLibrary_LIBRARY})
|
|
add_dependencies(ExternalLibrary ExternalTarget)
|
|
|
|
# Add an executable consuming all the byproducts.
|
|
add_executable(CustomCommandByproducts
|
|
CustomCommandByproducts.c
|
|
byproduct1.c timestamp1.txt
|
|
byproduct2.c
|
|
byproduct3.c
|
|
byproduct4.c
|
|
byproduct5.c
|
|
byproduct6.c
|
|
byproduct7.c
|
|
byproduct8.c timestamp8.txt
|
|
)
|
|
add_dependencies(CustomCommandByproducts Producer2)
|
|
add_dependencies(CustomCommandByproducts Producer3_4)
|
|
add_dependencies(CustomCommandByproducts ProducerExe)
|
|
target_link_libraries(CustomCommandByproducts ExternalLibrary)
|
|
|
|
if(CMAKE_GENERATOR STREQUAL "Ninja")
|
|
add_custom_target(CheckNinja ALL
|
|
COMMENT "Checking build.ninja"
|
|
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_SOURCE_DIR}/ninja-check.cmake
|
|
)
|
|
endif()
|