У меня есть подпроект в моем проекте для создания кода, используемого в проекте, однако я хочу включить его с помощью ExternalProject, чтобы его можно было построить и запустить независимо от цепочки инструментов, которую я использую для основного проекта.
В основном это работает, за исключением того, что я не могу понять, как его использовать в add_custom_command
, так как я хочу, чтобы он использовал целевое правило, указанное в документах:
Если в COMMAND указано целевое имя исполняемого файла (созданное командой add_executable()), оно будет автоматически заменено расположением исполняемого файла, созданного во время [...]
Простой пример настройки моего проекта, который повторяет проблему: https://godbolt.org/z/of8G4c4Gf
Замена ExternalProject_Add
на простой add_subdirectory
заставляет его работать, но не будет делать то, что я хочу, в случае использования другого набора инструментов.
ExternalProject_Add
добавит цель codegen
. Однако CMake понятия не имеет, что делает эта цель и какие выходные данные она предоставит, поскольку эта информация теперь скрыта во внешнем запуске CMake. Таким образом, внешний запуск CMake не имеет представления о бинарном файле codegen
, созданном на этом шаге, и о том, где он будет расположен. Вам необходимо указать полный путь к исполняемому файлу add_custom_command
вручную.
ExternalProject_Add
создаст codegen
и поместит полученный двоичный файл в подкаталог внутри вашего каталога сборки. Точное местоположение зависит от набора инструментов, поэтому восстановить полный целевой путь может быть сложно. Самый надежный способ решить эту проблему:
codegen
. Это позволит вам переносимо указать, по какому пути будет установлен двоичный файл относительно корневого каталога установки.INSTALL_DIR
на ExternalProject_Add
в подкаталог внутри вашего PROJECT_BINARY_DIR
.codegen
в пользовательской команде внешнего проекта CMake. Для работы на нескольких платформах вам может понадобиться переменная CMAKE_EXECUTABLE_SUFFIX.
Несколько связанная тема с потенциально полезной информацией: "CMake - ссылка на библиотеку, загруженную из ExternalProject_add()"