Допустим, у меня есть проект, в котором я уже запустил CMake в каталоге .build:
project/
.build/
.src
В настоящее время я должен сделать это, чтобы запустить сборку:
cd .build
make
Я хотел бы иметь возможность запускать make из корня моего проекта, возможно, с помощью
make -f ./build/Makefile
но это не работает. Я получаю такие ошибки
make[1]: CMakeFiles/Makefile2: No such file or directory
make[1]: *** No rule to make target `CMakeFiles/Makefile2'. Stop.
make: *** [all] Error 2
Это связано с тем, что Makefile, сгенерированный CMake, предполагает, что его рабочий каталог совпадает с его местонахождением (.build).
Возможно ли, чтобы CMake сгенерировал make-файл, чтобы make-файл менял рабочий каталог на то место, где он находится?
Ответ 1 · Christopher Bruns
Другой подход состоит в том, чтобы создать еще один Makefile в каталоге, из которого вы хотите запустить make, с примерно таким содержимым:
all:
cd ./build; make $(MFLAGS)
Затем вы можете просто ввести "make" из каталога верхнего уровня.
Я не думаю, что есть способ заставить cmake создать Makefile, который можно запустить из любого места. Это просто не то, как make обычно используется.
Но вы можете уговорить cmake создать дополнительный вспомогательный make-файл в корневом каталоге вашего проекта с помощью cmake, подобного следующему в CMakeLists.txt:
configure_file(ProjectRootMakefile.in ${CMAKE_SOURCE_DIR}/Makefile @ONLY)
(При необходимости замените это "${CMAKE_SOURCE_DIR}" выражением, которое разрешается в корневой каталог вашего проекта)
И вам нужно создать файл ProjectRootMakefile.in в вашем исходном дереве с таким содержимым:
all:
cd @CMAKE_BINARY_DIR@; make $(MFLAGS)
который будет использоваться в качестве шаблона для корневого Makefile вашего проекта. (Убедитесь, что вы используете символ табуляции, а не пробелы, перед "cd")
Я не проверял эти предложения, но их должно быть достаточно, чтобы дать вам общее представление.