add_custom_command
поставляется в двух вариантах: создание новых выходных данных и воздействие на отдельные цели. Docs
Какую команду вы вызываете? Это каким-либо образом дает результаты (новые файлы и т. Д.)? Если это так, используйте add_custom_command
вот так:
add_custom_command(
OUTPUT <output-file>
DEPENDS tgt1 tgt2
COMMAND <command>
ARGS <args>
COMMENT "Running <command> on targets tgt1 and tgt2."
)
При использовании второго варианта add_custom_command
, который не имеет аргумента OUTPUT
, поскольку он изменяет <target>
как шаг POST_BUILD
(или предварительная сборка, предварительная ссылка), требуется одна цель. Итак, какой из tgt1
и tgt2
будет изменен вашим <command>
?
Предположим, что tgt1
изменяется на шаге POST_BUILD, а tgt2 остается без изменений. Тогда вы можете сделать это так:
add_library(tgt2 SHARED b.cpp)
add_library(tgt1 SHARED a.cpp)
add_custom_command(
TARGET tgt1 POST_BUILD
COMMAND <command>
ARGS <args>
)
add_dependencies(tgt1 tgt2) # tgt1 depends on tgt2 because
# POST_BUILD-step is just the final step to build 'tgt1'
# NOTE: It is incorrect to modify 'tgt2' as POST_BUILD step for tgt1.
# So this example expects no changes to tgt2 in add_custom_command.
-
РЕДАКТИРОВАТЬ после более подробной информации, указанной в вопросе:
Рабочий пример
CMakeLists.txt
# I don't have 'icpc' and could not find it easily available for macOS.
# Instead, let's create a file "TGT" where contents are the two hashes of the two
# libraries, like done in 'Th.Thielemann's answer.
cmake_minimum_required(VERSION 3.10)
project(q50198141)
add_library(Big SHARED library1.cpp)
add_library(Foo SHARED library2.cpp)
add_custom_command(OUTPUT combined
COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/combine.sh
ARGS $<TARGET_FILE:Big> $<TARGET_FILE:Foo> combined
DEPENDS Big Foo combine.sh
COMMENT Build output 'combined'
)
add_custom_target(run_combined ALL DEPENDS combined)
combined.sh
(Убедитесь, что вы исключительный!)
#!/bin/bash
# Hardcoded for q50198141
# Args: In1 In2 Out
md5sum $1 $2 > $3