Eu queria saber se existe algum código de amostra para Makefile
s ( make
) e CMakeLists.txt
( cmake
) que ambos fazem a mesma coisa (a única diferença é que um está escrito make
e o outro cmake
).
Eu tentei procurar por 'cmake vs make', mas nunca encontrei nenhuma comparação de código. Seria muito útil entender as diferenças, mesmo que apenas para um caso simples.
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.make
ecmake
são tão distintos que deveriam ser vistos mais como ferramentas complementares em vez de ferramentas concorrentes?cp *.x $(OUTDIR)
" que você escreveria em um Makefile. Talvez a parte mais irritante para mim é que os Makefiles gerados são por design completamente não portáveis e inflexíveis (continuação)Respostas:
O seguinte Makefile constrói um executável nomeado a
prog
partir dos fontesprog1.c, prog2.c, prog3.c and main.c
.prog
está vinculadolibmystatlib.a
elibmydynlib.so
que também são construídos a partir da fonte. Além disso,prog
usa a bibliotecalibstuff.a
emstuff/lib
e seu cabeçalho emstuff/include
. O Makefile, por padrão, cria um destino de lançamento, mas também oferece um destino de depuração:Aqui está um
CMakeLists.txt
que faz (quase) exatamente o mesmo, com alguns comentários para sublinhar as semelhanças com o Makefile:Neste exemplo simples, as diferenças mais importantes são:
O CMake reconhece quais compiladores usar para cada tipo de fonte. Além disso, ele invoca a sequência correta de comandos para cada tipo de destino. Portanto, não há nenhuma especificação explícita de comandos como
$(CC) ...
,$(RANLIB) ...
e assim por diante.Todos os sinalizadores de compilador / vinculador usuais que lidam com a inclusão de arquivos de cabeçalho, bibliotecas, etc. são substituídos por comandos independentes de plataforma / sistema de compilação.
Bandeiras de depuração são incluídos por qualquer definindo a variável
CMAKE_BUILD_TYPE
de "depuração", ou passando-a para CMake quando invocando o programa:cmake -DCMAKE_BUILD_TYPE:STRING=Debug
.O CMake oferece também a inclusão independente de plataforma do sinalizador '-fPIC' (por meio da
POSITION_INDEPENDENT_CODE
propriedade) e muitos outros. Ainda assim, configurações mais obscuras podem ser implementadas manualmente no CMake, assim como em um Makefile (usandoCOMPILE_FLAGS
e propriedades semelhantes). É claro que o CMake realmente começa a brilhar quando bibliotecas de terceiros (como OpenGL) são incluídas de forma portátil.O processo de construção tem uma etapa se você usar um Makefile, ou seja, digitar
make
na linha de comando. Para o CMake, há duas etapas: Primeiro, você precisa configurar seu ambiente de construção (digitandocmake <source_dir>
no diretório de construção ou executando algum cliente GUI). Isso cria um Makefile ou algo equivalente, dependendo do sistema de compilação de sua escolha (por exemplo, make em Unixes ou VC ++ ou MinGW + Msys no Windows). O sistema de construção pode ser passado para CMake como um parâmetro; entretanto, o CMake faz escolhas padrão razoáveis, dependendo da configuração do seu sistema. Em segundo lugar, você executa a construção real no sistema de construção selecionado.Fontes e instruções de construção estão disponíveis em https://github.com/rhoelzel/make_cmake .
fonte
CPPFLAGS
vez deINCDIR
um, poderia ter usado as regras embutidas e a invocação explícita do compilador teria sido redundante. Da mesma forma, para o manuseio de ar, as regras internas também podem abranger isso. Além disso, por que definirCPP
eCC
explicitamente? Eles já estão configurados com bons valores pormake
, são variáveis predefinidas.make
também reconhece qual compilador usar para qual tipo de fonte, as regras internas são muitas.:=
vez de=
.cmake
é mais comparável a doautomake
quemake
.INCLUDES
vez deINCDIR
. Você não precisa de regras% .o:%. C.Pegue algum software que use CMake como seu sistema de construção (há uma abundância de projetos de código aberto para escolher como exemplo). Obtenha o código-fonte e configure-o usando CMake. Leia os makefiles resultantes e divirta-se.
É preciso ter em mente que essas ferramentas não mapeiam um a um. A diferença mais óbvia é que o CMake procura dependências entre arquivos diferentes (por exemplo, cabeçalho C e arquivos de origem), enquanto o make deixa isso para os autores do makefile.
fonte
Se esta pergunta for sobre um exemplo de
Makefile
saída doCMakeList.txt
arquivo, verifique as fontes cmake-backend e gere umMakefile
. 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,Observe que isso
CMake
ocultahow
a construção pode ser feito. Nós apenas especificamoswhat
é a entrada e a saída.A
CMakeLists.txt
contém a lista de chamadas de função que são definidas porcmake
.(Função CMake) Vs fazer regras
Makefile
Norules and recipes
são usados em vez defunctions
. Além dofunction
recurso -like,rules and recipes
fornece encadeamento. Meu minimalistaMakefile
será parecido com o seguinte,Embora o
executable.mk
seja parecido com o seguinte,Começando do zero, devo começar com algo
Makefile
como o seguinte,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 detalhesrecipe
mostrando quehow
a construção pode ser feita. É possível escreverexecutable.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,Saiba mais sobre
CMake
as variáveis padrão noCMakeCache.txt
arquivo. OCMake
código acima será equivalente aoMake
código abaixo,Observe que
CFLAGS
é uma variável interna emMake
, da mesma forma,CMAKE_C_FLAGS
é uma variável interna emCMake
.adicionar incluir e caminho de biblioteca no CMake
Podemos fazer isso
cmake
usando funções.Vs adicionar inclusão e caminho de biblioteca no Make
Podemos adicionar include e bibliotecas adicionando linhas como a seguinte,
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 comoauto-config
ferramentas usando aconfigure_file
função. É possível fazer mais truques escrevendo funções personalizadas. E, finalmente, podemos selecionar uma configuração como a seguinte,É 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,Acho variáveis internas,
Makefile-rules
eCMake-functions
são um bom começo para a comparação, boa sorte com mais escavações.fonte