CMake, add_subdirectory и наследование окружения

148
24 июля 2019, 10:10

Делаю проект с компиляцией под несколько платформ на c++. Некоторые файлы нужно прогнать утилитой (для простоты понимания скажем, что это транспилятор). Этот транспилятор нужно собрать из исходников, для него уже настроен CMakeLists.txt.

Подключаю его так:

add_subdirectory(my/transpilator)

Ну и добавляю таргет:

add_custom_target(transpile ALL COMMAND ${CMAKE_COMMAND} -D... 
            -DTRANSPILER_EXECUTABLE=$<TARGET_FILE:my_transpiler> -P transpile_all.cmake)

Подключаю его как зависимость к главному таргету и при сборке transpile_all.cmake транспилирует нужные файлы.

Проблема же возникает на платформах вроде Android или IOS. Так как для них нужно настраивать специфическое окружение, флаги компилятора, архитектуру и прочее, очевидно, что при подключении проекта транспилятора через add_subdirectory он унаследует все эти настройки. Окружение же настраивается тулчейном и добавить add_subdirectory перед настройкой окружения я не могу.

На данный момент думаю использовать "костыльное" решение - запускать cmake для транспилятора во время конфигурации и компилировать его. Что-то вроде:

execute_process(COMMAND ${CMAKE_COMMAND} -Htranspiler/folder -Btranspiler/output)
execute_process(COMMAND ${CMAKE_COMMAND} --build transpiler/folder ...)

Потом там экспортировать какую-нибудь переменную окружения и читать из нее путь до бинарника, чтобы передать в transpile_all.cmake.

В правильном ли я направлении думаю, или же есть какой-то способ, скажем, сделать add_subdirectory, но без наследования настроек окружения, или что-то подобное?

READ ALSO
Требуется подключить геймпад к плате Arduino Nano V3 (ATMega 168)

Требуется подключить геймпад к плате Arduino Nano V3 (ATMega 168)

Есть геймпад Aceline CG-1 на USB, который нужно подключить по Serial к Arduino NanoКак можно отслеживать нажатия кнопок (т

122
Z-функция. Реализация поиска

Z-функция. Реализация поиска

Требуется реализовать поиск подстроки в строке с использованием Z-функции

124
В чём отличие между выводом f и *&amp;f в функции, принимающей ссылку?

В чём отличие между выводом f и *&f в функции, принимающей ссылку?

Есть ли в этих записях различия? Выводят они одно и то же значениеНо может различие где-то глубже? А также в таком случае:

131
Метод drawImage()

Метод drawImage()

Какие аргументы использует метод drawImage()? Знаю первые 3, но что насчёт четвертого? В API подробной информации не нашел

122