mirror of
https://github.com/reactos/CMake.git
synced 2025-01-09 05:00:35 +00:00
86032ae0eb
This allows the developer to specify the byproducts relative to the binary directory without the need to set the binary directory location explicitly.
149 lines
5.1 KiB
CMake
149 lines
5.1 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)
|
|
|
|
# Generate the library file of an imported target as a byproduct
|
|
# of an external project. The byproduct uses <BINARY_DIR> that is substituted
|
|
# by the real binary path
|
|
if(CMAKE_CONFIGURATION_TYPES)
|
|
set(cfg /${CMAKE_CFG_INTDIR})
|
|
else()
|
|
set(cfg)
|
|
endif()
|
|
include(ExternalProject)
|
|
ExternalProject_Add(ExtTargetSubst
|
|
SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/External"
|
|
DOWNLOAD_COMMAND ""
|
|
INSTALL_COMMAND ""
|
|
BUILD_BYPRODUCTS "<BINARY_DIR>${cfg}/${CMAKE_STATIC_LIBRARY_PREFIX}ExternalLibrary${CMAKE_STATIC_LIBRARY_SUFFIX}"
|
|
)
|
|
ExternalProject_Get_Property(ExtTargetSubst binary_dir)
|
|
add_library(ExternalLibraryWithSubstitution STATIC IMPORTED)
|
|
set_property(TARGET ExternalLibraryWithSubstitution PROPERTY IMPORTED_LOCATION
|
|
${binary_dir}${cfg}/${CMAKE_STATIC_LIBRARY_PREFIX}ExternalLibrary${CMAKE_STATIC_LIBRARY_SUFFIX})
|
|
add_dependencies(ExternalLibraryWithSubstitution ExtTargetSubst)
|
|
|
|
# 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()
|