Se esta pergunta for sobre um exemplo de Makefile
saída do CMakeList.txt
arquivo, verifique as fontes cmake-backend e gere um Makefile
. Se não for, então adicionando à resposta de @Roberto, estou tentando torná-lo simples, escondendo os detalhes.
Função CMake
Embora Make
seja uma ferramenta flexível para regras e receitas, CMake
é uma camada de abstração que também adiciona o recurso de configuração.
Minha planície CMakeLists.txt
se parecerá com o seguinte,
cmake_minimum_required(VERSION 2.8)
project(example)
file(GLOB testapp_SOURCES *.cc)
add_executable(testapp ${testapp_SOURCES})
Observe que isso CMake
oculta how
a construção pode ser feito. Nós apenas especificamos what
é a entrada e a saída.
A CMakeLists.txt
contém a lista de chamadas de função que são definidas por cmake
.
(Função CMake) Vs fazer regras
Makefile
No rules and recipes
são usados em vez de functions
. Além do function
recurso -like, rules and recipes
fornece encadeamento. Meu minimalista Makefile
será parecido com o seguinte,
-include "executable.mk"
TARGETS=testapp.bin
all:${TARGETS}
Embora o executable.mk
seja parecido com o seguinte,
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)
Começando do zero, devo começar com algo Makefile
como o seguinte,
all: testapp.bin
testapp.bin:sourcea.o sourcb.o
$(CC) $(CFLAGS) -o $@ $^ $(LFLAGS) $(LIBS)
.PHONY: all clean
clean:
$(RM) $(OBJECTS) testapp.bin
Peguei esse snippet daqui e o modifiquei. Observe que algumas regras implícitas são adicionadas a este arquivo, as quais podem ser encontradas na documentação do makefile. Algumas variáveis implícitas também são relevantes aqui.
Observe que isso Makefile
fornece os detalhes recipe
mostrando que how
a construção pode ser feita. É possível escrever executable.mk
para manter os detalhes definidos em um arquivo. Dessa forma, o makefile pode ser reduzido como mostrei anteriormente.
Variáveis internas em CMake
eMake
Agora, ficando um pouco avançado, CMake
podemos definir um sinalizador de compilador como o seguinte,
set(CMAKE_C_FLAGS "-Wall")
Saiba mais sobre CMake
as variáveis padrão no CMakeCache.txt
arquivo. O CMake
código acima será equivalente ao Make
código abaixo,
CFLAGS = -Wall
Observe que CFLAGS
é uma variável interna em Make
, da mesma forma, CMAKE_C_FLAGS
é uma variável interna em CMake
.
adicionar incluir e caminho de biblioteca no CMake
Podemos fazer isso cmake
usando funções.
target_include_directories(testapp PRIVATE "myincludes")
list(APPEND testapp_LIBRARIES
mytest mylibrarypath
)
target_link_libraries(testapp ${testapp_LIBRARIES})
Vs adicionar inclusão e caminho de biblioteca no Make
Podemos adicionar include e bibliotecas adicionando linhas como a seguinte,
INCLUDES += -Imyincludes
LIBS += -Lmylibrarypath -lmytest
Observe que as linhas acima podem ser geradas a partir de ferramentas de geração automática ou pkg-config. (embora o Makefile não dependa de ferramentas de configuração automática)
CMake configurar / ajustar
Normalmente é possível gerar algum config.h
arquivo como auto-config
ferramentas usando a configure_file
função. É possível fazer mais truques escrevendo funções personalizadas. E, finalmente, podemos selecionar uma configuração como a seguinte,
cmake --build . --config "Release"
É possível adicionar alguma opção configurável usando a option
função.
Makefile configurar / ajustar
Se de alguma forma precisamos compilá-lo com algum sinalizador de depuração, podemos invocar o make
semelhante,
make CXXFLAGS=NDEBUG
Acho variáveis internas, Makefile-rules
e CMake-functions
são um bom começo para a comparação, boa sorte com mais escavações.
cmake
eu também queria isso. Mas eu duvido que você o encontre porque os recursos simplesmente não mapeiam bem um ao outro. Se você tentarcmake
agir como se estivessemake
, vai enlouquecer, sério. Melhor começar do zero. Coisas que são triviaismake
estão bastante envolvidascmake
e vice-versa.