"Script" de build em C

64 views
Skip to first unread message

Thiago Adams

unread,
Feb 25, 2021, 2:30:01 PM2/25/21
to ccppbrasil

Não seria bom se pudessemos gerar libs a partir dos fontes
ou termos "scripts" de build com ZERO dependencias e
multiplataforma?

Gostaria de mostrar uma alternativa e saber o que voces acham.

Imaginem que a lib que voce quer distruibuir tenha um arquivo build.c.

Para compilar sua lib a unica coisa que voce tem que fazer é compilar
este arquivo build.c e depois rodar.

Ou seja, as instruções seriam no linux

gcc build.c -o build
./build

ou  no prompt de commando do VC++ do windows

cl build.c
build 

Estas instruções não mudam de acordo com a complexidade
do que voce precisa fazer dentro do build.c

Como seria este build.c?

Dentro desde build.c nós chamamos o compilador através de da função

O interessante é que é possível detectar o compilar dentro do build.c
podemos ter scripts mais estáticos ou dinamicos tudo mantendo
este build.c multiplataforma.

Exemplo simples:
-----------------

#include <stdlib.h>
#include <stdio.h>

/*Compiler and platform detection*/

#ifdef _MSC_VER
#define COMPILER "cl "
#elif __GNUC__ != 0
#define COMPILER "gcc "
#else
#error compiler not defined
#endif

/*Files you want*/
#define FILES "main.c file.c"

/*output*/
#define OUT "hellobuild"

#define COMMAND_LINE  COMPILER  " " FILES " -o " OUT

int main()
{
  printf("%s\n", COMMAND_LINE);
  system(COMMAND_LINE);
}

-----------

Este "script" funciona no windows e linux, e compila
os arquivo do projecto "main.c" e "file.c".

Este é um exemplo minimo, mas como programadores C
vocês podem imaginar as possibilidades.

Espero que tenha ficado clara a ideia. O que acham?










Fabio A Mazzarino

unread,
Feb 25, 2021, 7:13:29 PM2/25/21
to ccppb...@googlegroups.com
Thiago:

Acho que não entendi direito, pq me parece que vc propôs o Makefile?


Fabio A, Mazzarino
-- 
Lab C++ - Código, Dicas e Snippets


--
http://ccppbrasil.github.io/
https://twitter.com/ccppbrasil
 
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "ccppbrasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para ccppbrasil+...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/ccppbrasil/c181280d-06ca-4f3e-b626-ea5c3ced488en%40googlegroups.com.

Thiago Adams

unread,
Feb 25, 2021, 7:35:14 PM2/25/21
to ccppbrasil
On Thursday, February 25, 2021 at 9:13:29 PM UTC-3 fabio.m...@gmail.com wrote:
Thiago:

Acho que não entendi direito, pq me parece que vc propôs o Makefile?



Não sou especialista em makefile mas acredito que uma das tarefas dele
é compilar os arquivos que mudaram  (Certo?)
Isto seria possível de fazer neste build script, porém não teria porque fazer
algo  exatamente igual ao que já existe.

Alguém sabe se o makefile é universal?  Ou seja, o mesmo funcionar no windows
e no linux? Quem usa o make file  usa ele "diariamente" dentro IDE?

No meu caso, por exemplo, uso o projeto e as configurações (que são muitas) dentro
do visual studio. Mesmo que esteja fazendo um software multiplataforma, quando
eu estiver dentro do windows quero continuar usando a solution do VC++ filtros etc.

Dito tudo isso, o caso de uso que imagino deste script seria evitar que o usuário
da lib tivesse que instalar algo no computador dele para usar a lib. Um exemplo
aonde isso acontece é o openssl que é pior lib que já vi em termos de geração a
partir do fonte.

Não quer dizer que usaria o build.c todo dia no ciclo editar debugar dentro do IDE
(como talvez alguém use o make?)

A outra utilidade é o build de um produto usando a linguagem C como "script".

Por exemplo, pode pegar os fontes de um repositorio, pode alterar o numero de
versão, compilar, gerar instalador, gerar documentaçcão, assinar, rodar testes e
publicar a versão para download etc. 

A "graça" do C seria poder ter algo multiplaforma e sem dependencias .

Noto que linguagens novas estão adotando este padrão do build ser escrita na
própria linguagem  e acho positivo esta questão de ter algo universal que tenha
pelo menos o básico.






 







Emerson de Freitas Barcelos

unread,
Feb 25, 2021, 7:45:08 PM2/25/21
to ccppb...@googlegroups.com
Experimente o CMake. Acho que faz o que deseja.


Em qui., 25 25e fev. 25e 2021 às 21:35, Thiago Adams

--
http://ccppbrasil.github.io/
https://twitter.com/ccppbrasil
 
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "ccppbrasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para ccppbrasil+...@googlegroups.com.
Para ver essa discussão na Web, acesse

Renan Prata

unread,
Feb 25, 2021, 7:45:28 PM2/25/21
to ccppb...@googlegroups.com
A ideia é criar um CMake? Com o Cmake você consegue criar tanto arquivos para serem compilados com o gnu make (makefile), ou vs project, xcode project. Depende de como você configura o seu CMakeLists.txt:

ref: https://cmake.org/.

[]s,

--
http://ccppbrasil.github.io/
https://twitter.com/ccppbrasil
 
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "ccppbrasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para ccppbrasil+...@googlegroups.com.

Thiago Adams

unread,
Feb 25, 2021, 8:05:40 PM2/25/21
to ccppb...@googlegroups.com

O Cmake vira uma dependência, o que é uma desvantagem.

Também acho estranho algo gerar uma solution do VC++.
Prefiro eu   mesmo gerar e deixar como parte do projeto para quem quiser desenvolver na plataforma em questão.

Para distribuir algo com fontes 
(lib por exemplo) quem quer usar tem que instalar o IDE? ou msbuild provavelmente alem do proprio cmake.

Alternativa do build.c voce so faz aquele linha de comando que falei e a lib vai ser compilada.


 
On 25 Feb 2021, at 21:45, Renan Prata <renan...@gmail.com> wrote:


Você recebeu essa mensagem porque está inscrito em um tema no grupo "ccppbrasil" dos Grupos do Google.
Para cancelar inscrição nesse tema, acesse https://groups.google.com/d/topic/ccppbrasil/7hz5F14Kc00/unsubscribe.
Para cancelar inscrição nesse grupo e todos os seus temas, envie um e-mail para ccppbrasil+...@googlegroups.com.
Para ver essa discussão na Web, acesse https://groups.google.com/d/msgid/ccppbrasil/CAO4xdenoCD_4O_-AJbgsstF1GH%3D%3DctReNSe%2BEyJd7j1RA_mvJw%40mail.gmail.com.

Thiago Adams

unread,
Feb 28, 2021, 3:49:20 PM2/28/21
to ccppbrasil


On Thursday, February 25, 2021 at 9:35:14 PM UTC-3 Thiago Adams wrote:
..

Alguém sabe se o makefile é universal?  Ou seja, o mesmo funcionar no windows
e no linux? Quem usa o make file  usa ele "diariamente" dentro IDE?

Virgilio Fornazin

unread,
Mar 1, 2021, 9:20:40 AM3/1/21
to ccppb...@googlegroups.com
e as flags de compilacao ?
e as otimizacoes especificas ?
pragmas para cada compilador ?

sendo bem simplista, isso reduziria o C / C++ a um 'C#' da vida (ou java, o qual odeiem mais)... um spec, um compilador... e ja sabemos onde isso vai dar...



--
http://ccppbrasil.github.io/
https://twitter.com/ccppbrasil
 
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "ccppbrasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para ccppbrasil+...@googlegroups.com.

Virgilio Fornazin

unread,
Mar 1, 2021, 9:22:49 AM3/1/21
to ccppb...@googlegroups.com
complementando: acho o CMake bom, tem muitos defeitos ainda (e gambiarras, devido as cagadas de compatibilidade), mas acho que se derivasse algo dele mais organizado seria bom.

o vcpkg (conan, etC) abstraem isso, e resolve a maioria dos problemas, e aplica alguns patchs as vezes pra deixar tudo funcionando do jeito que pensaram, porém, é mais um facilitador.


Thiago Adams

unread,
Mar 1, 2021, 9:45:48 AM3/1/21
to ccppbrasil
On Monday, March 1, 2021 at 11:20:40 AM UTC-3 virgilio...@gmail.com wrote:
e as flags de compilacao ?
e as otimizacoes especificas ?
pragmas para cada compilador ?

sendo bem simplista, isso reduziria o C / C++ a um 'C#' da vida (ou java, o qual odeiem mais)... um spec, um compilador... e ja sabemos onde isso vai dar...



Todas estas coisas podem ser adicionadas normalmente sem restrição ou prejuízo
de perda de informação.

É possível, opcionalmente, criar o conceito de "flag universal" que se aplica para
mais de um compilador. Isso fica por conta de quem fez o build script.
Na pratica este flag seria um define com um nome definido de acordo com
cada compilador.

Embora seja possível usar um compilador C diferente para o script de build
do que o compilador usado para gerar o exe ou lib, usar o mesmo para ambos
trás a vantagem da auto-detecção.

Ali no meu exemplo coloquei algo bem simples para saber se é o VC++ ou gcc.

#ifdef _MSC_VER
#define COMPILER "cl "
#elif __GNUC__ != 0
#define COMPILER "gcc "
#else
#error compiler not defined
#endif

Dentro de cada bloco de if pode-se colocar a configuração exclusiva
do gcc ou VC++.

A "linguagem" do script é conhecida por todo mundo não precisa
manual  nenhum.











Virgilio Fornazin

unread,
Mar 10, 2021, 2:24:27 PM3/10/21
to ccppb...@googlegroups.com
ué, mas isso o CMake já faz!

--
http://ccppbrasil.github.io/
https://twitter.com/ccppbrasil
 
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "ccppbrasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para ccppbrasil+...@googlegroups.com.

Virgilio Fornazin

unread,
Mar 10, 2021, 2:25:45 PM3/10/21
to ccppb...@googlegroups.com
e quanto a dependencia: um compilador também e uma dependencia pra gerar.
sei la...

Renan Prata

unread,
Mar 12, 2021, 5:56:31 AM3/12/21
to ccppb...@googlegroups.com
Virgílio,

Eu tava dando uma olhada e vi esse carinha aqui : https://mesonbuild.com/

Parece que o build do gstreamer usa ele e parece bom para manipular dependências de libs terceiras e tbm mais simples de crosscompilar (só estou falando de impressão, nunca usei).

E Thiago, sobre dependência... Cara, isso faz parte de qualquer projeto maduro. É muito melhor depender de uma ferramenta madura que já é usada muito no mercado, que você pode ir num fórum pra te ajudar com soluções, do que você reinventar a roda. O gasto de energia e dinheiro é desnecessário. Como o Virgílio disse, o compilador e o toolchain tbm são dependências para projetos cross. Se você usa o cmake (de maneira correta) ele vai te fazer ganhar tempo e economizar recurso. 




Euripedes Rocha Filho

unread,
Mar 12, 2021, 6:24:59 AM3/12/21
to ccppb...@googlegroups.com
Meson é bacana, menos estranho que o cmake. Já utilizei em alguns projetos pessoais. Com ele você escreve um arquivo de build que se assemelha às práticas indicadas ao cmake "moderno".

Thiago Adams

unread,
Mar 12, 2021, 7:48:15 AM3/12/21
to ccppbrasil
On Friday, March 12, 2021 at 8:24:59 AM UTC-3 rocha.e...@gmail.com wrote:
Meson é bacana, menos estranho que o cmake. Já utilizei em alguns projetos pessoais. Com ele você escreve um arquivo de build que se assemelha às práticas indicadas ao cmake "moderno".


O interessante eh se você tiver que usar uma lib que precisa do meson outra do cmake
outra do  vcpkg .. Ai você tem que aprender uma depois outra depois outra.


  

Euripedes Rocha Filho

unread,
Mar 12, 2021, 8:03:29 AM3/12/21
to ccppb...@googlegroups.com
Você pode usar o cmake em um subproject no meson. 
Sobre o vcpkg ele é mais um package manager certo? Estaria mais para ser comparado com o wrap system(do próprio meson) e com o conan. Nunca utilizei, então não tenho opinião sobre a integração. 

Sobre o aprendizado das ferramentas é natural... 
Eu prefiro o meson mas investi um tempo em aprender a usar o cmake por questões profissionais e atualmente é o que eu uso mais frequentemente. Também já precisei escrever Makefiles e resolvi explorar outros build systems. 

Sobre o tópico original, se você deseja se aventurar em entender melhor esses problemas vá em frente... Há muito a aprender mas é um caminho sem glórias rsrs
O autor do meson já palestrou algumas vezes sobre o tema:
https://www.youtube.com/watch?v=34KzT2yvQuM

Buscando no youtube você encontra mais. 

--
http://ccppbrasil.github.io/
https://twitter.com/ccppbrasil
 
[&] C & C++ Brasil - http://www.ccppbrasil.org/
Para sair dessa lista, envie um e-mail para ccppbrasil-...@googlegroups.com
---
Você recebeu essa mensagem porque está inscrito no grupo "ccppbrasil" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para ccppbrasil+...@googlegroups.com.

Fabrício Cabral

unread,
Mar 12, 2021, 8:09:15 AM3/12/21
to ccppbrasil
Eu também achei o meson bem bacana!

At.te.



--
--fx

de...@roo.com.br

unread,
Mar 15, 2021, 3:35:17 PM3/15/21
to ccppbrasil
sistemas pra build tem mto!

gnu make, ninja e premake funciona mto bem pras necessidades mais variadas (as minhas)

Virgilio Fornazin

unread,
Mar 15, 2021, 5:11:34 PM3/15/21
to ccppb...@googlegroups.com
o ultimo CMake faz muita coisa legal ja, tem gambi? tem... mas ate ai
Meson é legal, ja usei
Ja usei autoconf + automake (GNU)
Ja fiz make direto

Agora uma coisa que eu era resiliente e comecei a usar bastante são os package manager: to usando vcpkg / conan bastante dependendo do projeto e ambos tem seus prós e contras... 

e CMake ja é meio que standard em varias IDE´s... o que ajuda muito

mas sim... ainda tem um gap a se completar, que é o package-manager saber compilar um projeto 'automaticamente'...  o que não acontece ainda (devido as particularidades de cada build-versão, que adiciona N em complexidade)



Thiago Adams

unread,
May 24, 2021, 4:51:45 PM5/24/21
to ccppbrasil

Estou usando esta solução em um projeto tamanho médio
que tem libs, includes dirs, include path openssl, testes etc.

Com WSL compilo todas estas plataformas diretamente.

Curiosidade é como faço a linha de comando

Linux
gcc build.c -o build; ./build; rm 
build clang build.c -o build; ./build; rm build

Windows

clang build.c -o build.exe && build && del build.exe 
 cl build.c -o build.exe && build && del build.exe

É possível fazer algo extremamente simples  e  deixar tudo pré-configurado.
Mas acho que na vida real cada plataforma vai ter uma especificidade o 
que é melhor não deixar nada muito pré-definido, pois o que é para ser 
simples acaba atrapalhando quando o "pronto" não serve.


 

Reply all
Reply to author
Forward
0 new messages