Если этот вопрос касается образца 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) против правил создания
В используются вместо . В дополнение к -подобной функции обеспечьте цепочку. Мой минимализм будет выглядеть следующим образом,Makefile
rules and recipes
functions
function
rules and recipes
Makefile
-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
, и наоборот.