Matwey
B
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/bin)
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
все бинари будут в bin, все o файлы будут в lib
B
то же самое можно сделать для конкретного таргета
https://stackoverflow.com/questions/3742090/custom-directory-for-cmake-library-output#3744130
Matwey
Не совсем
Matwey
Короче, давайте считать, что у меня для части объектников свой отдельный "компилятор". Я знаю как их сгенерировать из каких файлов.
Ned
Ребят, это не чат по cmake
Ned
Давайте без оффтопа
🦥Alex Fails
это не оффтоп, кстати, а о билд-системе, которая используется (практически всегда) только для C++-проектов
Danil
Больше чатиков богу чатиков
Danil
Ned
Тот случай, когда нужен чат с холиварами, чтобы похоливарить за смейк)
Danil
Ned
🦥Alex Fails
#holywar
Giperion
Иногда тернарки незаменяемы
Giperion
https://image.prntscr.com/image/oNRfjkzmSvi07M1WnBXZNQ.png
Giperion
обычный if тут не канает)
🦥Alex Fails
ну, это очевидно, да
Ned
Эт почему?
Ned
if (header.size > 0)
...
🦥Alex Fails
потому что тебе надо конструировать внутри ифа класс
Giperion
Потому что если делать обычным if'ом, то тут два варианта:
1) Он останется в скоупе if'а а не в скоупе функции
🦥Alex Fails
вообще можно извратиться, добавив переменную, но тернарка тут выразительне
Giperion
2) Если использовать безскоупный if, то будет дважды объявленая переменная - ошибка
Giperion
у меня кстати компилятор ругается что переменная не объявлена, лол
Giperion
Т.е. если принципиально нельзя использовать тернарки, то уже начинаются извращения с указателями. Но этого порно мне не надо
Ned
Как я понимаю, тут недавно за применимость тернарок говорили?
🦥Alex Fails
да пес знает, просто ногда некоторые считают, что они сложные/не нужны и прочие догмы, подтверждаемые только своим частным личным опытом
Giperion
тернарки несложные, лол
Giperion
Но их легко сделать нечитабельными
Berkus
Berkus
Ned
Какую только хрень ни придумают от нечего делать. Мне даже стало жаль бедные тернарки...
Ned
Хз, лично я пользую из везде где только можно
Elmir
,где чат по IDE?
Berkus
Giperion
@ned_ogl Я их не люблю, приходится строчку кода долго всматриваться, расшифровывая контекст и if в котором он применен
Giperion
Его писать удобно, а читать - нет
Ned
Хз, спорное заявление. У меня в голове он интерпретируется вполне нативно
Giperion
у меня они работают, пока я помню код на который смотрю. Когда я его забываю, и открываю вновь, я их долго читаю
Giperion
Ну мой код с 2015 года спокойно можно прочитать, а вот до этого - нет. Сильно помогает Visual Assist, который быстро разъясняет как эта переменная или функция играет роль в приложений
Matwey
Berkus
https://github.com/metta-systems/metta/blob/develop/src/interfaces/CMakeLists.txt#L77 ну как-то так
Berkus
покажи код
Square
Matwey
foreach(shader_source IN ITEMS ${SHADER_SOURCES})
file(RELATIVE_PATH shader_relative ${CMAKE_CURRENT_SOURCE_DIR} ${shader_source})
get_filename_component(shader_name ${shader_relative} NAME_WE)
get_filename_component(shader_base ${shader_relative} DIRECTORY)
set(shader_binary "${CMAKE_CURRENT_BINARY_DIR}/${shader_base}/${shader_name}.o")
add_custom_command(OUTPUT ${shader_binary}
WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
COMMAND mkdir -p ${CMAKE_CURRENT_BINARY_DIR}/${shader_base}
COMMAND ld -r -b binary -o ${shader_binary} ${shader_source}
COMMAND objcopy --rename-section .data=.rodata,contents,readonly ${shader_binary} ${shader_binary}
MAIN_DEPENDENCY ${shader_source})
list(APPEND SOURCES ${shader_binary})
endforeach(shader_source)
Matwey
Вот этот ужас теперь нужно как-то редуцировать в приличный вид
Berkus
ну вот же у тебя указан shader_source
Matwey
Да
Matwey
Но я вот руками как-то не фанат делать из него shader_binary
Berkus
смысле руками
Matwey
При этом я до сих пор не понимаю, как мне получить имя таргета к которому потом всё линкуется
Matwey
в прямом
Matwey
file(RELATIVE_PATH shader_relative ${CMAKE_CURRENT_SOURCE_DIR} ${shader_source})
get_filename_component(shader_name ${shader_relative} NAME_WE)
get_filename_component(shader_base ${shader_relative} DIRECTORY)
set(shader_binary "${CMAKE_CURRENT_BINARY_DIR}/${shader_base}/${shader_name}.o")
Berkus
указывай в команде OUTPUT
Matwey
Это ногами что-ли?
Berkus
посмотри мою ссылку пожалуйста
Berkus
Matwey
Нет, это не нормально
Berkus
это нормально, кастомная команда может писать что угодно, куда угодно
Matwey
А я хочу чтобы она для каждого таргета который требует такой отпут сделала отдельную копию
Berkus
заверни это в функцию или макрос
Berkus
и вызывай.
Berkus
посмотри мою ссылку, опять же
Matwey
И как это поможет?
Berkus
И как это поможет?
add_target_shaders(target_name SHADERS shader1 shader2) так и поможет, у тебя будет имя таргета и всего остального
Matwey
Так ок
Berkus
Так ок
cmake тебе позволяет все делать в нормальном "декларативном" стиле
см. https://github.com/metta-systems/metta/blob/develop/src/modules/heap_mod/CMakeLists.txt#L1 и потом как это работает - https://github.com/metta-systems/metta/blob/f6534be98af5bcd8e08ebfc701be4fd8257601ca/src/CMakeLists.txt#L128
Matwey
Но внутри придется к какому-то экзекьютаблу добавлять дополнительные исходники потом через проперти.
Berkus
этим твой макро будет заниматься
Matwey
да
Matwey
внутри моего макро
Berkus
ну не вижу проблемы, КАК ТО тебе придется их добавлять всё равно
Berkus
один раз написанный макро прекрасно это решает