Se esta pergunta for sobre um exemplo de Makefilesaída do CMakeList.txtarquivo, 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 Makeseja 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.txtse 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 CMakeoculta howa construção pode ser feito. Nós apenas especificamos whaté a entrada e a saída.
A CMakeLists.txtcontém a lista de chamadas de função que são definidas por cmake.
(Função CMake) Vs fazer regras
MakefileNo rules and recipessão usados em vez de functions. Além do functionrecurso -like, rules and recipesfornece encadeamento. Meu minimalista Makefileserá parecido com o seguinte,
-include "executable.mk"
TARGETS=testapp.bin
all:${TARGETS}
Embora o executable.mkseja 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 Makefilecomo 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 Makefilefornece os detalhes recipemostrando que howa construção pode ser feita. É possível escrever executable.mkpara manter os detalhes definidos em um arquivo. Dessa forma, o makefile pode ser reduzido como mostrei anteriormente.
Variáveis internas em CMakeeMake
Agora, ficando um pouco avançado, CMakepodemos definir um sinalizador de compilador como o seguinte,
set(CMAKE_C_FLAGS "-Wall")
Saiba mais sobre CMakeas variáveis padrão no CMakeCache.txtarquivo. O CMakecódigo acima será equivalente ao Makecó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 cmakeusando 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.harquivo como auto-configferramentas usando a configure_filefunçã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 optionfunção.
Makefile configurar / ajustar
Se de alguma forma precisamos compilá-lo com algum sinalizador de depuração, podemos invocar o makesemelhante,
make CXXFLAGS=NDEBUG
Acho variáveis internas, Makefile-rulese CMake-functionssão um bom começo para a comparação, boa sorte com mais escavações.
cmakeeu também queria isso. Mas eu duvido que você o encontre porque os recursos simplesmente não mapeiam bem um ao outro. Se você tentarcmakeagir como se estivessemake, vai enlouquecer, sério. Melhor começar do zero. Coisas que são triviaismakeestão bastante envolvidascmakee vice-versa.