изменить cmake на двоичный каталог

Допустим, у меня есть проект, в котором я уже запустил 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-файл менял рабочий каталог на то место, где он находится?


person paleozogt    schedule 13.01.2010    source источник


Ответы (2)


Другой подход состоит в том, чтобы создать еще один 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»)

Я не проверял эти предложения, но их должно быть достаточно, чтобы дать вам общее представление.

person Christopher Bruns    schedule 16.01.2010
comment
Это интересная идея... Есть какие-нибудь мысли о том, как заставить CMake поместить все цели в make-файл верхнего уровня? - person paleozogt; 19.01.2010
comment
Вы можете рассмотреть возможность использования процесса сборки в исходном коде старой школы. В наши дни это устарело, но раньше было нормой. Поместите файл CMakeLists.txt в корневой каталог проекта. ccmake -i ., сделать, сделать что угодно и сделать установку прямо здесь. Ваши исходники будут смешаны с вашими бинарными файлами, и Purist будет ахуеть, но это может удовлетворить ваши потребности. - person Christopher Bruns; 20.01.2010

Вам просто нужно указать make, где находится ваш базовый каталог, не нужно менять cmake.

make -C your_build_directory
person YuppieNetworking    schedule 13.01.2010
comment
Этот метод полезен, потому что он позволяет делать из любого каталога и имеет нормальный доступ ко всем целям, в том числе для завершения табуляции. - person Paul Thompson; 12.02.2014