cmake подскажите
От: m11  
Дата: 07.02.22 07:29
Оценка:
Есть древний проект на makefiles там есть

SOMEDEP=some.cpp\
some.h\
lib1.h\
lib2.h\
dataset1.cpp\
dataset2.cpp

some.obj: $(SOMEDEP)
$(CC) some.cpp

dataset2.cpp это генереные файлы которые #include в some.cpp


Пробую портировать это на CMAKE

set(SOMEDEP some.cpp
some.h
lib1.h
lib2.h
dataset1.cpp
dataset2.cpp
)
add_library(some OBJECT ${SOMEDEP})


в итоге после компиляции some.cpp идет попытка компилировать dataset1.cpp dataset2.cpp. как обьяснить CMAKE что так делать не нужно? Пробовал target_sources() тоже самое

Еще заменил если генерировать в какие-то makefile то *.h игнорируются, а ведь по идее они должны добавлятся в зависимости чтобы при их измениние код перекомпилировался. Что удивительно в VS project сам! находит эти зависимости и такой проблемы нету.
Может есть другая кроссплатформеная система сборки?
Re: cmake подскажите
От: reversecode google
Дата: 07.02.22 09:00
Оценка: +1
https://samthursfield.wordpress.com/2015/11/21/cmake-dependencies-between-targets-and-files-and-custom-commands/

set_source_files_properties(
${CMAKE_CURRENT_BINARY_DIR}/../src/foo.c
PROPERTIES GENERATED TRUE
)


вообще файлы которые инклудятся в some.cpp указывать не надо
их cmake найдет и сделает депенденсы сам

нет системы сборки луче чем cmake
или вы хотите завязаться на какую то не популярную систему ?
ну это тоже самое что учить умирающие языки
Re: cmake подскажите
От: Skorodum Россия  
Дата: 08.02.22 08:57
Оценка:
Здравствуйте, m11, Вы писали:

m11>в итоге после компиляции some.cpp идет попытка компилировать dataset1.cpp dataset2.cpp. как обьяснить CMAKE что так делать не нужно? Пробовал target_sources() тоже самое

Примерно так:

set(GENERATOR "${CMAKE_CURRENT_LIST_DIR}/codegen.py")
set(GENERATED_INPUT "${CMAKE_CURRENT_LIST_DIR}/dataset.asdf")
set(GENERATOR_OUTPUT "${CMAKE_CURRENT_LIST_DIR}/dataset.cpp")

add_custom_command(
WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}"
OUTPUT "${GENERATED_FILES}"
COMMAND "${PYTHON_EXECUTABLE}" "${GENERATOR}" "${GENERATED_OUTPUT}" "${GENERATOR_INPUT}"
DEPENDS "${GENERATOR}" "${GENERATOR_INPUT}"
COMMENT "Generating code")

add_custom_target(GeneratedTarget DEPENDS "${GENERATED_OUTPUT}")

add_executable(foo
main.cpp
${GENERATED_OUTPUT})

add_dependencies(foo PRIVATEGeneratedTarget)


Cmake motto: "Всё есть цель"
cmake
Re[2]: cmake подскажите
От: m11  
Дата: 09.02.22 10:29
Оценка:
Здравствуйте, Skorodum, Вы писали:

m11>>в итоге после компиляции some.cpp идет попытка компилировать dataset1.cpp dataset2.cpp. как обьяснить CMAKE что так делать не нужно? Пробовал target_sources() тоже самое

S>Примерно так:

S>

S>set(GENERATOR "${CMAKE_CURRENT_LIST_DIR}/codegen.py")
S>set(GENERATED_INPUT "${CMAKE_CURRENT_LIST_DIR}/dataset.asdf")
S>set(GENERATOR_OUTPUT "${CMAKE_CURRENT_LIST_DIR}/dataset.cpp")

S>add_custom_command(
S> WORKING_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}"
S> OUTPUT "${GENERATED_FILES}"
S> COMMAND "${PYTHON_EXECUTABLE}" "${GENERATOR}" "${GENERATED_OUTPUT}" "${GENERATOR_INPUT}"
S> DEPENDS "${GENERATOR}" "${GENERATOR_INPUT}"
S> COMMENT "Generating code")

S>add_custom_target(GeneratedTarget DEPENDS "${GENERATED_OUTPUT}")

S>add_executable(foo
S> main.cpp
S> ${GENERATED_OUTPUT})

S>add_dependencies(foo PRIVATE GeneratedTarget)


К сожалению это не сработает, будет ошибка при попытке компиляции ${GENERATED_OUTPUT}
Вот примерный проект https://1drv.ms/u/s!Av5wPFxnwkx9cKyTd6cKnn2EYDw

Если убрать ${GENERATED_OUTPUT} из add_executable то dataset.cpp не будет обновлятся при изменении dataset.asdf

Щас попробую обновить свой CMAKE 3.19
Re[2]: cmake подскажите
От: m11  
Дата: 09.02.22 10:49
Оценка: -1
Здравствуйте, reversecode, Вы писали:

R>https://samthursfield.wordpress.com/2015/11/21/cmake-dependencies-between-targets-and-files-and-custom-commands/


R>

R>set_source_files_properties(
R> ${CMAKE_CURRENT_BINARY_DIR}/../src/foo.c
R> PROPERTIES GENERATED TRUE
R> )


R>вообще файлы которые инклудятся в some.cpp указывать не надо

R>их cmake найдет и сделает депенденсы сам

Как я понял их не cmake находит а студия. Делал "Unix Makefiles" "Borland Makefiles" там вообще нет упоминаний депендесов.

R>нет системы сборки луче чем cmake


Если это лучшая то какая тогда худшая(((

Вот есть
add_executable(foo one.cpp two.cpp one.h two.h)

теперь надо сделать тоже самое но допустим one.cpp скомпилировать с ключом -D_ENABLE_SORT_BUBBLE и как это сделать?
если добавить

set_source_files_properties(one.cpp PROPERTIES COMPILE_FLAGS -D_ENABLE_SORT_BUBBLE)
add_executable(foo_test one.cpp two.cpp one.h two.h)

но теперь все таргеты будут компилится с -D_ENABLE_SORT_BUBBLE выход использовать add_library но это не очень то эффективно, оно будет делать Lib файл даже если указать OBJECT
казалось бы добавь что-то типа set_Target_source_files_properties() не я что-то не вижу этой функции. А ведь Cmake лет 10 уже не меньше.

Cmake глючная и непродуманая система ей пользуются потому что нет альтернатив.

R>или вы хотите завязаться на какую то не популярную систему ?

R>ну это тоже самое что учить умирающие языки

Да мне лиш бы работало.
Re[3]: cmake подскажите
От: reversecode google
Дата: 09.02.22 10:57
Оценка:
m11>Cmake глючная и непродуманая система ей пользуются потому что нет альтернатив.

говорят так только те кто не хочет изучить что то новое
а хочет свою логику в голове переложить в уже чю то существующую

для таких людей есть книга

Craig Scott
Professional CMake: A Practical Guide

изучайте


я думаю высший разум который создавал человека в лице вас
если бы делал вас — "лишь бы работало"
вы были бы очень не довольны им
Re[3]: cmake подскажите
От: Skorodum Россия  
Дата: 09.02.22 12:26
Оценка:
Здравствуйте, m11, Вы писали:

m11>Щас попробую обновить свой CMAKE 3.19

Все работает, версия CMake тут не причем, у вас имена переменных напутаны: "GENERATOR_INPUT" и "GENERATED_INPUT".
Вот рабочий код для вашего проекта:

cmake_minimum_required(VERSION 3.22)

project(start)

set(GENERATOR_CMD "${CMAKE_CURRENT_LIST_DIR}/codegen.cmd")
set(GENERATOR_INPUT "${CMAKE_CURRENT_LIST_DIR}/dataset.asdf")
set(GENERATED_OUTPUT "${CMAKE_CURRENT_LIST_DIR}/dataset.cpp")

add_custom_command(
OUTPUT "${GENERATED_OUTPUT}"
COMMAND "${GENERATOR_CMD}" "${GENERATED_OUTPUT}" "${GENERATOR_INPUT}"
DEPENDS "${GENERATOR}" "${GENERATOR_INPUT}"
COMMENT "Generating code by CMD")

add_custom_target(GeneratedTarget
DEPENDS
${GENERATED_OUTPUT}
${GENERATOR}
${GENERATOR_INPUT})

add_executable(start one.cpp two.cpp one.h two.h)
add_dependencies(start GeneratedTarget)

#need to build start_check1 with -D_KEY_ONE for one.cpp -D_KEY_TWO for two.cpp
set_source_files_properties(one.cpp PROPERTIES COMPILE_FLAGS -D_KEY_ONE)
set_source_files_properties(two.cpp PROPERTIES COMPILE_FLAGS -D_KEY_TWO)
add_executable(start_check1 one.cpp two.cpp one.h two.h)
add_dependencies(start_check1 GeneratedTarget)
target_include_directories(start_check1 PRIVATE ${CMAKE_CURRENT_BINARY_DIR})

#need to build start_check2 with -D_KEY_THREE one.cpp -D_KEY_THREE for two.cpp
set_source_files_properties(one.cpp PROPERTIES COMPILE_FLAGS -D_KEY_THREE)
set_source_files_properties(two.cpp PROPERTIES COMPILE_FLAGS -D_KEY_THREE)
add_executable(start_check2 one.cpp two.cpp one.h two.h)
add_dependencies(start_check2 GeneratedTarget)
target_include_directories(start_check2 PRIVATE ${CMAKE_CURRENT_BINARY_DIR})


P.S. Файл генерится в CMAKE_CURRENT_BINARY_DIR, чтобы папка с исходниками оставалась чистой.
cmake
Re[4]: cmake подскажите
От: m11  
Дата: 17.02.22 22:33
Оценка:
Здравствуйте, reversecode, Вы писали:

m11>>Cmake глючная и непродуманая система ей пользуются потому что нет альтернатив.


R>говорят так только те кто не хочет изучить что то новое

R>а хочет свою логику в голове переложить в уже чю то существующую

Ну да некоторые изучили cmake например и больше ничого нового не хотят знать.


R>для таких людей есть книга


R>Craig Scott

R>Professional CMake: A Practical Guide

R>изучайте


да там простенькие проекты

система сборки как минимум должна предоставить возможность задать ключи компилятора, а тут можна задать глобально для одного .cpp но во всех таргетах, один и тотже .cpp нельзя использовать в разных таргетах это если юзать add_*(таргет source1.cpp source2.cpp)
Если юзать add_library то да можно но все удобство куда-то пропадает когда проект за 100 таргетов.
Еще вот пример интуитивного интерфейса:
target_compile_definitions(target PRIVATE -D_DEBUG_)
а кустомные команды с бубнами add_custom_target
Сама компиляция стало гораздо медленей даже в nmake

Мне думается cmake такой запутаный специально ибо такая бизнес модель.

Единственный плюс это мультиплатформа

Хотелось бы уведеть еще систем сборки

R>я думаю высший разум который создавал человека в лице вас

R>если бы делал вас — "лишь бы работало"
R>вы были бы очень не довольны им

Хех это на личности перешли
Re[4]: cmake подскажите
От: m11  
Дата: 17.02.22 22:38
Оценка:
Здравствуйте, Skorodum, Вы писали:

S>Здравствуйте, m11, Вы писали:


m11>>Щас попробую обновить свой CMAKE 3.19

S>Все работает, версия CMake тут не причем, у вас имена переменных напутаны: "GENERATOR_INPUT" и "GENERATED_INPUT".
S>Вот рабочий код для вашего проекта:
S>

S>cmake_minimum_required(VERSION 3.22)


S>add_executable(start one.cpp two.cpp one.h two.h)
S>add_dependencies(start GeneratedTarget)

S>#need to build start_check1 with -D_KEY_ONE for one.cpp -D_KEY_TWO for two.cpp
S>set_source_files_properties(one.cpp PROPERTIES COMPILE_FLAGS -D_KEY_ONE)
S>set_source_files_properties(two.cpp PROPERTIES COMPILE_FLAGS -D_KEY_TWO)
S>add_executable(start_check1 one.cpp two.cpp one.h two.h)
S>add_dependencies(start_check1 GeneratedTarget)
S>target_include_directories(start_check1 PRIVATE ${CMAKE_CURRENT_BINARY_DIR})

S>#need to build start_check2 with -D_KEY_THREE one.cpp -D_KEY_THREE for two.cpp
S>set_source_files_properties(one.cpp PROPERTIES COMPILE_FLAGS -D_KEY_THREE)
S>set_source_files_properties(two.cpp PROPERTIES COMPILE_FLAGS -D_KEY_THREE)
S>add_executable(start_check2 one.cpp two.cpp one.h two.h)
S>add_dependencies(start_check2 GeneratedTarget)
S>target_include_directories(start_check2 PRIVATE ${CMAKE_CURRENT_BINARY_DIR})


S>P.S. Файл генерится в CMAKE_CURRENT_BINARY_DIR, чтобы папка с исходниками оставалась чистой.


Спасибо, cmake может генерировать файлы, но проблема несколько в другой плоскости
Re[5]: cmake подскажите
От: Skorodum Россия  
Дата: 18.02.22 08:36
Оценка:
Здравствуйте, m11, Вы писали:

m11>Спасибо, cmake может генерировать файлы, но проблема несколько в другой плоскости

В какой?
Re[3]: cmake подскажите
От: Skorodum Россия  
Дата: 18.02.22 08:53
Оценка:
Здравствуйте, m11, Вы писали:

m11>Вот есть

m11>add_executable(foo one.cpp two.cpp one.h two.h)
m11>теперь надо сделать тоже самое но допустим one.cpp скомпилировать с ключом -D_ENABLE_SORT_BUBBLE и как это сделать?
m11>если добавить
m11>set_source_files_properties(one.cpp PROPERTIES COMPILE_FLAGS -D_ENABLE_SORT_BUBBLE)
m11>add_executable(foo_test one.cpp two.cpp one.h two.h)
m11>но теперь все таргеты будут компилится с -D_ENABLE_SORT_BUBBLE
Нет, все будет работать как надо. Смотрите ваш код внимательно, у вас опять где-то ошибка.

m11>выход использовать add_library но это не очень то эффективно, оно будет делать Lib файл даже если указать OBJECT

Нет.

m11>Cmake глючная и непродуманая система ей пользуются потому что нет альтернатив.

Нет.
1. У CMake есть проблемы, но не те, что вы перечислили.
2. Альтернативы есть (qbs, meson, build2, etc.)

m11>Да мне лиш бы работало.

Все работает. Очень сложные проекты собираются CMake.
Re[5]: cmake подскажите
От: reversecode google
Дата: 18.02.22 16:05
Оценка:
Здравствуйте, m11, Вы писали:

m11>Здравствуйте, reversecode, Вы писали:


m11>>>Cmake глючная и непродуманая система ей пользуются потому что нет альтернатив.


R>>говорят так только те кто не хочет изучить что то новое

R>>а хочет свою логику в голове переложить в уже чю то существующую

m11>Ну да некоторые изучили cmake например и больше ничого нового не хотят знать.


строго говоря, я cmake изучил в этом году, потратил аж целых два дня
до этого все проекты писал на обычных makefile
и выбирал среди разных альтернатив
критерии требования были
— язык на котором разрабатывается альтернатива — C/C++
— умение генерить makefile для виндовых nmake
— распространенность среди опенсорс С/С++ проектов

в итоге выбрал cmake
поскольку большинство опенсорс проектов которые мониторю, тоже используют его
ну и говорят что кто то активно контрибютит cmake + msvc, поговаривают что мол ms доплачивают разрабам cmake

да еще оказывается его и на собеседованиях начали часто спрашивать

можете посмотреть в сторону build2 его вроде гугл использует
но мне он не понравился
Re[6]: cmake подскажите
От: m11  
Дата: 18.02.22 23:00
Оценка:
Здравствуйте, Skorodum, Вы писали:

m11>>Спасибо, cmake может генерировать файлы, но проблема несколько в другой плоскости

S>В какой?

В том что бы задать ключи компиляции. Те исходный файл один но с разными дефайнами будет разное поведение и чтобы проверить все варианты в разных "таргетах" надо постаратся. Если использовать add_executable(bla source1.cpp source2.cpp) set_source_files_properties ключи задаются для исходника сразу во всех таргетах в разный таргет нельзя передать разный дефайн. add_library target_link_libraries может но зачем тогда такой дизайн у add_executable?
Re[7]: cmake подскажите
От: reversecode google
Дата: 18.02.22 23:10
Оценка:
https://stackoverflow.com/questions/6665887/different-compile-flags-for-same-file-in-different-targets
Re[7]: cmake подскажите
От: Skorodum Россия  
Дата: 19.02.22 13:05
Оценка:
Здравствуйте, m11, Вы писали:

m11>Здравствуйте, Skorodum, Вы писали:


m11>>>Спасибо, cmake может генерировать файлы, но проблема несколько в другой плоскости

S>>В какой?

m11>В том что бы задать ключи компиляции.

Тогда ваше "но" тут совсем неуместно. С первой вашей проблемой разобрались, это другая.

m11>Те исходный файл один но с разными дефайнами будет разное поведение и чтобы проверить все варианты в разных "таргетах" надо постаратся. Если использовать add_executable(bla source1.cpp source2.cpp) set_source_files_properties ключи задаются для исходника сразу во всех таргетах в разный таргет нельзя передать разный дефайн. add_library target_link_libraries может но зачем тогда такой дизайн у add_executable?

Разные ключи, конечно же, можно передать в разные цели.
Если один и тот же файл надо с разными ключами подключать в разные цели, то надо разбить файл и не мучаться.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.