Makefile [RESOLVIDO]

1. Makefile [RESOLVIDO]

???
gokernel

(usa Linux Mint)

Enviado em 23/08/2018 - 06:57h

Olá pessoal !

Rapidinho/direto ... "correndo para o trampo" ...

Tem como o arquivo ( Makefile ) identificar a plataforma ( Windows, Linux ) ?

Meu ( Makefile ):

# Project: SUMMER LANGUAGE

CPP = g++
CC = gcc
OBJ = obj/core.o obj/lex.o obj/asm.o obj/summer.o
BIN = summer
CFLAGS = -O2 -Wall -DUSE_JIT
RM = rm -f

.PHONY: all all-before all-after clean clean-custom

all: all-before summer all-after

clean: clean-custom
${RM} $(OBJ) $(BIN)

$(BIN): $(OBJ)
#
# Queria que nesta linha, somente para Linux fosse assim ( -ldl ):
#
$(CC) $(OBJ) -o "summer" $(LIBS) -ldl

obj/core.o: src/core.c
$(CC) $(CFLAGS) -c src/core.c -o obj/core.o

obj/lex.o: src/lex.c
$(CC) $(CFLAGS) -c src/lex.c -o obj/lex.o

obj/asm.o: src/asm.c
$(CC) $(CFLAGS) -c src/asm.c -o obj/asm.o

obj/summer.o: summer.c
$(CC) $(CFLAGS) -c summer.c -o obj/summer.o



Queria que somente(a linha referida no Makefile) para Windows fosse assim:

$(CC) $(OBJ) -o "summer" $(LIBS)


Queria que somente(a linha referida no Makefile) para linux fosse assim com ( -ldl ):

$(CC) $(OBJ) -o "summer" $(LIBS) -ldl



Chamo o make assim:
make -f Makefile_JIT


Fui claro ?

Grato !




  


2. MELHOR RESPOSTA

Paulo
paulo1205

(usa Ubuntu)

Enviado em 23/08/2018 - 09:15h

Qual variante e/ou versão do utilitário make você está usando em cada plataforma?

Existem várias implementações diferentes de make, e cada uma delas tem suas próprias variações sintáticas, peculiaridades, situações em que comandos externos podem ser executados etc. Para facilitar, você poderia usar em todas as plataformas uma versão de make que tenha suporte aos recursos de que você precisa.

Uma sugestão é usar o GNU make em todas as plataformas, pois ele costuma ser o make nativo do Linux, e é bem suportado em outros sistemas.

Dito isso, você poderia fazer algo parecido com o seguinte (sintaxe do GNU Make).

LIBS=sua lista de bibliotecas comuns a todos os sistemas
ifeq ($(OS),Windows_NT)
LIBS+=sua lista de bibliotecas usadas no Windows
# Outras definições exclusivas do Windows, como CC, CFLAGS etc.
else
OS=$(shell uname -s)
ifeq ($OS,Linux)
LIBS+=sua lista de bibliotecas no Linux
else
LIBS+=sua lista de bibliotecas para outros sistemas
endif
endif


3. Re: Makefile

???
gokernel

(usa Linux Mint)

Enviado em 23/08/2018 - 11:26h

Muito obrigado "paulo1205", funcionou !


Usando o GNU Make 3.80.

O Makefile ficou assim:

# Project: SUMMER LANGUAGE

CPP = g++
CC = gcc
OBJ = obj/core.o obj/lex.o obj/asm.o obj/summer.o
BIN = summer
CFLAGS = -O2 -Wall -DUSE_JIT
ifeq ($(OS),Windows_NT)
LIBS =
else
LIBS = -ldl
endif
RM = rm -f

.PHONY: all all-before all-after clean clean-custom

all: all-before summer all-after

clean: clean-custom
${RM} $(OBJ) $(BIN)

$(BIN): $(OBJ)
$(CC) $(OBJ) -o "summer" $(LIBS)

obj/core.o: src/core.c
$(CC) $(CFLAGS) -c src/core.c -o obj/core.o

obj/lex.o: src/lex.c
$(CC) $(CFLAGS) -c src/lex.c -o obj/lex.o

obj/asm.o: src/asm.c
$(CC) $(CFLAGS) -c src/asm.c -o obj/asm.o

obj/summer.o: summer.c
$(CC) $(CFLAGS) -c summer.c -o obj/summer.o


Estou usando o Windows 7 ... e reconheceu a tag ( Windows_NT ) ...
Pergunta 01:
Se usar o Windows 98, essa TAG vai funcionar ?

Grato !



4. Re: Makefile [RESOLVIDO]

Paulo
paulo1205

(usa Ubuntu)

Enviado em 23/08/2018 - 13:02h

Na verdade ele pega o valor da variável de ambiente OS. Você tem de ver se essa variável é definida por padrão nessa outra versão do Windows e, se o for, que valor ela tem. Eu chutaria que qualquer sistema compatível com Win32 a teria, mas não tenho certeza.






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts