Мне было интересно, есть ли какой-нибудь пример кода для Makefile
s ( make
) и CMakeLists.txt
( cmake
), которые оба делают одно и то же (единственная разница в том, что один написан, make
а другой - cmake
).
Я попытался найти cmake vs make, но так и не нашел сравнения кода. Было бы действительно полезно понять различия, даже если бы это был простой случай.
cmake
я тоже этого хотел. Но я сомневаюсь, что вы его найдете, потому что возможности просто не очень хорошо соотносятся друг с другом. Если вы попытаетесь вестиcmake
себя такmake
, как будто вы серьезно сведете себя с ума. Лучше всего начать с нуля. Вещи, которые являются тривиальнымиmake
, довольно сложныcmake
, и наоборот.make
иcmake
настолько различны, что их следует рассматривать скорее как дополнительные, а не как конкурирующие инструменты?cp *.x $(OUTDIR)
", которые вы бы написали в Makefile. Возможно, самое неприятное для меня то, что сгенерированные файлы Makefile по замыслу совершенно непереносимы и негибки (продолжение)Ответы:
Следующий Makefile создает исполняемый файл с именем
prog
из источниковprog1.c, prog2.c, prog3.c and main.c
.prog
связан с,libmystatlib.a
иlibmydynlib.so
оба они также построены из исходного кода. Кроме того,prog
использует библиотекуlibstuff.a
вstuff/lib
и ее заголовок вstuff/include
. Makefile по умолчанию создает цель выпуска, но предлагает также цель отладки:Вот,
CMakeLists.txt
что делает (почти) точно так же, с некоторыми комментариями, чтобы подчеркнуть сходство с Makefile:В этом простом примере наиболее важными отличиями являются:
CMake распознает, какие компиляторы использовать для какого типа источника. Кроме того, он вызывает правильную последовательность команд для каждого типа цели. Таким образом, не существует явная спецификация команд , как
$(CC) ...
,$(RANLIB) ...
и так далее.Все обычные флаги компилятора / компоновщика, связанные с включением файлов заголовков, библиотек и т. Д., Заменены независимыми от платформы командами / независимыми от системы сборки.
Отладочные флаги включены либо установив переменную
CMAKE_BUILD_TYPE
в «Debug» или путем передачи его в CMake при вызове программы:cmake -DCMAKE_BUILD_TYPE:STRING=Debug
.CMake также предлагает независимое от платформы включение флага '-fPIC' (через
POSITION_INDEPENDENT_CODE
свойство) и многих других. Тем не менее, более непонятные настройки могут быть реализованы вручную в CMake так же, как и в Makefile (с использованиемCOMPILE_FLAGS
и подобных свойств). Конечно, CMake действительно начинает сиять, когда сторонние библиотеки (например, OpenGL) включаются в переносимом виде.Если вы используете Makefile, процесс сборки состоит из одного шага, а именно ввода
make
в командной строке. Для CMake есть два шага: во-первых, вам необходимо настроить среду сборки (либо введяcmake <source_dir>
каталог сборки, либо запустив какой-либо клиент с графическим интерфейсом). Это создает Makefile или что-то подобное, в зависимости от выбранной вами системы сборки (например, make в Unix или VC ++ или MinGW + Msys в Windows). Систему сборки можно передать CMake в качестве параметра; однако CMake делает разумный выбор по умолчанию в зависимости от конфигурации вашей системы. Во-вторых, вы выполняете фактическую сборку в выбранной системе сборки.Исходные коды и инструкции по сборке доступны по адресу https://github.com/rhoelzel/make_cmake .
источник
CPPFLAGS
вместоINCDIR
можно было бы использовать встроенные правила, и явный вызов компилятора был бы излишним. Точно так же для обработки ar встроенные правила также могут покрыть это. Кроме того, зачем устанавливатьCPP
иCC
явно? Для них уже установлены хорошие значенияmake
, они являются предопределенными переменными.make
также распознает, какой компилятор использовать для какого типа источника, встроенных правил много.:=
вместо=
.cmake
более сопоставимо сautomake
чемmake
.INCLUDES
вместоINCDIR
. Вам не нужны правила% .o:%. C.Возьмите какое-нибудь программное обеспечение, которое использует CMake в качестве своей системы сборки (в качестве примера можно выбрать множество проектов с открытым исходным кодом). Получите исходный код и настройте его с помощью CMake. Прочтите полученные make-файлы и наслаждайтесь.
Следует иметь в виду, что эти инструменты не соответствуют друг другу. Наиболее очевидное различие состоит в том, что CMake сканирует зависимости между разными файлами (например, заголовком C и исходными файлами), тогда как make оставляет это на усмотрение авторов make-файлов.
источник
Если этот вопрос касается образца
Makefile
выводаCMakeList.txt
файла, проверьте исходники cmake-backend и сгенерируйте один из нихMakefile
. Если это не так, то добавляя ответ @Roberto, я пытаюсь упростить его, скрывая детали.Функция CMake
Хотя
Make
это гибкий инструмент для правил и рецептов,CMake
это слой абстракции, который также добавляет функцию конфигурации.Моя равнина
CMakeLists.txt
будет выглядеть следующим образом:Обратите внимание, что
CMake
шкураhow
сборка может быть сделано. Мы только указалиwhat
вход и выход.CMakeLists.txt
Содержит список функций-вызовов, которые определеныcmake
.(Функция CMake) против правил создания
В используются вместо . В дополнение к -подобной функции обеспечьте цепочку. Мой минимализм будет выглядеть следующим образом,
Makefile
rules and recipes
functions
function
rules and recipes
Makefile
Хотя это
executable.mk
будет выглядеть следующим образом,Начиная с нуля, я начну со
Makefile
следующего:Я получил этот фрагмент отсюда и изменил его. Обратите внимание, что в этот файл добавлены некоторые неявные правила, которые можно найти в документации makefile. Здесь также актуальны некоторые неявные переменные.
Обратите внимание, что
Makefile
здесь подробноrecipe
показано,how
что сборка может быть выполнена. Можно написать,executable.mk
чтобы детали, определенные в одном файле. Таким образом можно уменьшить размер make-файла, как я показал ранее.Внутренние переменные в
CMake
иMake
Теперь, когда
CMake
мы немного продвинулись, мы можем установить флаг компилятора следующим образом:Пожалуйста, узнайте больше о
CMake
переменных по умолчанию вCMakeCache.txt
файле. ПриведенныйCMake
выше код будет эквивалентенMake
приведенному ниже коду,Обратите внимание, что
CFLAGS
это внутренняя переменная вMake
, точно так же,CMAKE_C_FLAGS
это внутренняя переменная вCMake
.добавление включения и пути к библиотеке в CMake
Мы можем сделать это с
cmake
помощью functions.Против добавления include и пути к библиотеке в Make
Мы можем добавить include и библиотеки, добавив такие строки, как следующие:
Обратите внимание, что эти строки выше могут быть созданы с помощью инструментов auto-gen или pkg-config. (хотя Makefile не зависит от инструментов автоконфигурации)
CMake настроить / настроить
Обычно можно сгенерировать некоторый
config.h
файл, как иauto-config
инструменты, с помощьюconfigure_file
функции. Можно сделать больше трюков, написав собственные функции. И, наконец, мы можем выбрать следующую конфигурацию:С помощью
option
функции можно добавить некоторые настраиваемые параметры .Настройка / настройка Makefile
Если каким-то образом нам нужно скомпилировать его с каким-либо флагом отладки, мы можем вызвать
make
подобное,Я думаю , что внутренние переменные,
Makefile-rules
иCMake-functions
являются хорошим началом для сравнения, удачи с большим количеством рытья.источник