Я использую cmake
для создания моего проекта. Для UNIX я хотел бы набрать make
из корневого каталога проекта и вызвать cmake
для создания правильных Make файлов (если они еще не существуют), а затем построить мой проект. Я бы хотел, чтобы внутренние файлы cmake
(объектные файлы, cmake
внутренние Make файлы и т.д.) Были скрыты (например, помещены в каталог .build
), поэтому он не загромождает мою директорию проекта.
В моем проекте есть несколько подпроектов (в частности, библиотека, исполняемый файл пользователя и исполняемый файл unit test). Я бы хотел, чтобы Makefiles (т.е. я набираю make
и это происходит) для каждого подпроекта для выполнения cmake
(как указано выше) и строит только этот подпроект (с зависимостями, поэтому библиотека будет построена из исполняемых файлов) Makefiles, если необходимо). Результирующая двоичная (.so библиотека или исполняемый файл) должна находиться в каталоге подпроектов.
Я сделал Makefile, который делает бит проекта немного хорошо, хотя он чувствует себя несколько хакерским. Я не могу использовать конкретные цели, потому что мой Makefile просто вызывает make
в каталоге cmake
build.
Обратите внимание, что поскольку библиотека является единственной зависимостью (и, вероятно, ее не нужно создавать вручную, а потому, что я ленив), я опустил ее в своем Makefile.
BUILD_DIR := .build
.PHONY: all clean project-gui ${BUILD_DIR}/Makefile
all: project-gui project-test
clean:
@([ -d ${BUILD_DIR} ] && make -C ${BUILD_DIR} clean && rm -r ${BUILD_DIR}) || echo Nothing to clean
project-gui: ${BUILD_DIR}/Makefile
@make -C ${BUILD_DIR} project-gui
@cp ${BUILD_DIR}/project-gui/project-gui [email protected]
project-test: ${BUILD_DIR}/Makefile
@make -C ${BUILD_DIR} project-test
@cp ${BUILD_DIR}/project-test/project-test [email protected]
${BUILD_DIR}/Makefile:
@[ -d ${BUILD_DIR} ] || mkdir -p ${BUILD_DIR}
@[ -f ${BUILD_DIR}/Makefile ] || (cd ${BUILD_DIR} && cmake ${CMAKE_OPTS} ..)
Если это помогает, здесь моя структура проекта (если это "неправильно", пожалуйста, скажите мне - я все еще изучаю cmake
):
project/
project/CMakeLists.txt
project/common.cmake
project/Makefile -- see Makefile above for this; should be replaced with something better, building libproject, project-gui, and project-test
project/libproject/
project/libproject/CMakeLists.txt
project/libproject/libproject.so -- after build
project/libproject/Makefile -- doesn't exist yet; should build libproject only
project/libproject/source/
project/libproject/include/
project/project-gui/
project/project-gui/CMakeLists.txt
project/project-gui/Makefile -- doesn't exist yet; should build libproject then project-gui
project/project-gui/source/
project/project-gui/include/
project/project-test/
project/project-test/CMakeLists.txt
project/project-test/Makefile -- doesn't exist yet; should build libproject then project-test
project/project-test/source/
project/project-test/include/
Если вы еще не поймали, я в основном ищу способ создания проекта и подпроектов, как будто cmake
не было: как будто мой проект состоял только из Make файлов. Это можно сделать? Является ли решение элегантным или грязным? Должен ли я пытаться сделать что-то еще вместо этого?
Спасибо!