Автоматически использовать каталог в качестве имени проекта в CMake

Я новичок в использовании CMake для управления моей системой сборки, поэтому, если я глуп, и это плохая идея, сообщите мне.

Я хотел бы настроить файл cmakelists.txt, чтобы при выполнении

project( ... )

имя каталога автоматически становится именем проекта. Я хочу сделать это, потому что мне удобнее копировать весь каталог одного проекта в качестве отправной точки другого. Однако, хотя я всегда переименовываю каталог в нечто значимое, я часто забываю изменить строку project(name) файла cmakelists.txt, а затем я заканчиваю работу с несколькими проектами, открытыми в моей среде сборки с тем же именем, что запутывает.

В идеале, если в имени каталога есть пробелы, они заменяются символами подчеркивания.

Может ли CMake сделать это? И это плохая идея, по какой-то причине я не вижу?

Ответ 1

Это можно сделать, добавив следующее к началу вашего CMakeLists.txt:

get_filename_component(ProjectId ${CMAKE_CURRENT_SOURCE_DIR} NAME)
string(REPLACE " " "_" ProjectId ${ProjectId})
project(${ProjectId})

Я не вижу проблемы с этим для проектов с отбросами, хотя, по моему мнению, производственные проекты обычно имеют предопределенное имя, которое будет явно указано в команде project.

Когда вы упоминаете, что вы "копируете весь каталог одного проекта в качестве отправной точки другого", я полагаю, вы не включаете дерево сборки при копировании? CMake на самом деле не способен обрабатывать дерево сборки.

Ответ 2

Я думаю, что CMAKE_CURRENT_LIST_DIR больше подходит для этого случая

get_filename_component(ProjectId ${CMAKE_CURRENT_LIST_DIR} NAME)
string(REPLACE " " "_" ProjectId ${ProjectId})
project(${ProjectId} C CXX)