Если этот вопрос касается образца Makefileвывода CMakeList.txtфайла, проверьте исходники cmake-backend и сгенерируйте один из них Makefile. Если это не так, то добавляя ответ @Roberto, я пытаюсь упростить его, скрывая детали.
Функция CMake
Хотя Makeэто гибкий инструмент для правил и рецептов, CMakeэто слой абстракции, который также добавляет функцию конфигурации.
Моя равнина CMakeLists.txtбудет выглядеть следующим образом:
cmake_minimum_required(VERSION 2.8)
project(example)
file(GLOB testapp_SOURCES *.cc)
add_executable(testapp ${testapp_SOURCES})
Обратите внимание, что CMakeшкура howсборка может быть сделано. Мы только указали whatвход и выход.
CMakeLists.txtСодержит список функций-вызовов, которые определены cmake.
(Функция CMake) против правил создания
В используются вместо . В дополнение к -подобной функции обеспечьте цепочку. Мой минимализм будет выглядеть следующим образом,Makefilerules and recipesfunctionsfunctionrules and recipesMakefile
-include "executable.mk"
TARGETS=testapp.bin
all:${TARGETS}
Хотя это executable.mkбудет выглядеть следующим образом,
SOURCES=$(wildcard *.cpp)
OBJECTS=$(SOURCES:.cpp=.o)
DEPS=$(SOURCES:.cpp=.d)
%.bin:$(OBJECTS)
$(CC) $(CFLAGS) -o $@ $^ $(LFLAGS) $(LIBS)
.PHONY: all clean
clean:
$(RM) $(OBJECTS) $(DEPS) $(TARGETS)
-include $(DEPS)
Начиная с нуля, я начну со Makefileследующего:
all: testapp.bin
testapp.bin:sourcea.o sourcb.o
$(CC) $(CFLAGS) -o $@ $^ $(LFLAGS) $(LIBS)
.PHONY: all clean
clean:
$(RM) $(OBJECTS) testapp.bin
Я получил этот фрагмент отсюда и изменил его. Обратите внимание, что в этот файл добавлены некоторые неявные правила, которые можно найти в документации makefile. Здесь также актуальны некоторые неявные переменные.
Обратите внимание, что Makefileздесь подробно recipeпоказано, howчто сборка может быть выполнена. Можно написать, executable.mkчтобы детали, определенные в одном файле. Таким образом можно уменьшить размер make-файла, как я показал ранее.
Внутренние переменные в CMakeиMake
Теперь, когда CMakeмы немного продвинулись, мы можем установить флаг компилятора следующим образом:
set(CMAKE_C_FLAGS "-Wall")
Пожалуйста, узнайте больше о CMakeпеременных по умолчанию в CMakeCache.txtфайле. Приведенный CMakeвыше код будет эквивалентен Makeприведенному ниже коду,
CFLAGS = -Wall
Обратите внимание, что CFLAGSэто внутренняя переменная в Make, точно так же, CMAKE_C_FLAGSэто внутренняя переменная в CMake.
добавление включения и пути к библиотеке в CMake
Мы можем сделать это с cmakeпомощью functions.
target_include_directories(testapp PRIVATE "myincludes")
list(APPEND testapp_LIBRARIES
mytest mylibrarypath
)
target_link_libraries(testapp ${testapp_LIBRARIES})
Против добавления include и пути к библиотеке в Make
Мы можем добавить include и библиотеки, добавив такие строки, как следующие:
INCLUDES += -Imyincludes
LIBS += -Lmylibrarypath -lmytest
Обратите внимание, что эти строки выше могут быть созданы с помощью инструментов auto-gen или pkg-config. (хотя Makefile не зависит от инструментов автоконфигурации)
CMake настроить / настроить
Обычно можно сгенерировать некоторый config.hфайл, как и auto-configинструменты, с помощью configure_fileфункции. Можно сделать больше трюков, написав собственные функции. И, наконец, мы можем выбрать следующую конфигурацию:
cmake --build . --config "Release"
С помощью optionфункции можно добавить некоторые настраиваемые параметры .
Настройка / настройка Makefile
Если каким-то образом нам нужно скомпилировать его с каким-либо флагом отладки, мы можем вызвать makeподобное,
make CXXFLAGS=NDEBUG
Я думаю , что внутренние переменные, Makefile-rulesи CMake-functionsявляются хорошим началом для сравнения, удачи с большим количеством рытья.
cmakeя тоже этого хотел. Но я сомневаюсь, что вы его найдете, потому что возможности просто не очень хорошо соотносятся друг с другом. Если вы попытаетесь вестиcmakeсебя такmake, как будто вы серьезно сведете себя с ума. Лучше всего начать с нуля. Вещи, которые являются тривиальнымиmake, довольно сложныcmake, и наоборот.