2009-09-17 11 views
3

Hé les gars, je suis un peu nouveau dans tout le concept makefile donc j'ai quelques questions à ce sujet. Je crée un projet utilisant CodeBlocks sous linux, j'ai utilisé un outil appelé cbp2mak pour créer un fichier .make à partir du projet CodeBlocks (si quelqu'un connaît un meilleur outil, merci de me le faire savoir). Maintenant, je ne sais pas quelle est la différence entre .mak et .makefile, quelqu'un pourrait-il me le dire? Je peux compiler .mak en utilisant "make -C .mak" mais quelle est la différence? La raison pour laquelle j'essaie de l'utiliser est parce que je veux fournir le code source de mon projet et je veux qu'il soit compilable à la fois sous Linux et Windows, donc je ne veux pas leur donner mon fichier de projet codeblocks. Donc j'ai pensé que je pourrais utiliser un makefile qui peut être utilisé pour construire à la fois linux et windows.Makefile et .Mak File + CodeBlocks et VStudio

Je voudrais également vérifier dans Windows si les deux compilateurs MinGW et VC++ existent et construire la source avec les deux compilateurs, sous Linux, ce sera seulement avec GNU GCC. Le fichier .mak a également des macros pour déterminer ce qu'il faut construire selon qu'il s'exécute sur Windows ou Linux car il existe des fichiers spécifiques à la plate-forme.

Autant de questions:

-Quelle est la différence entre .mak et .makefile

-Peut je lance un fichier .mak dans Windows? dire en utilisant Visual Studio?

-Peut-il y avoir une meilleure solution à ce que je fais maintenant? (J'ai utilisé cpb2mak car il génère automatiquement un fichier .mak qui économise beaucoup de temps car je ne sais pas comment créer des fichiers makefiles)

N'hésitez pas à nous donner des conseils ou des astuces à ce sujet.

EDIT:

Je suis maintenant mettre en place le dossier complet .mak

Aussi mon projet est une bibliothèque que je construis à la fois une version statique et partagée de celui-ci. Le fichier .mak a été généré automatiquement mais je Hadded la poignée de plate-forme avec la ifdef et « shell, uname » fonction

# project performer-1.0 


export PATH := /opt/wx/2.8/bin:$(PATH) 
export LD_LIBRARY_PATH := /opt/wx/2.8/lib:$(LD_LIBRARY_PATH) 

_WX = /home/gr/projects/gui/codeblocks/wx 
_WX.LIB = $(_WX)/lib 
_WX.INCLUDE = $(_WX)/include 

_CB = /home/gr/projects/gui/codeblocks/cb/src 
_CB.INCLUDE = $(_CB)/include 
_CB.LIB = $(_CB)/devel 



CFLAGS_C = $(filter-out -include "sdk.h",$(CFLAGS)) 

# ----------------------------------------- 

# MAKE_DEP = -MMD -MT [email protected] -MF $(@:.o=.d) 

CFLAGS = -Wall 
INCLUDES = -I../performer-1.0 
LDFLAGS = -s 
RCFLAGS = 
LDLIBS = $(T_LDLIBS) -lrt -lboost_regex-gcc43-mt -lxerces-c -lstdc++ 

LINK_exe = gcc -o [email protected] $^ $(LDFLAGS) $(LDLIBS) 
LINK_con = gcc -o [email protected] $^ $(LDFLAGS) $(LDLIBS) 
LINK_dll = gcc -o [email protected] $^ $(LDFLAGS) $(LDLIBS) -shared 
LINK_lib = rm -f [email protected] && ar rcs [email protected] $^ 
COMPILE_c = gcc $(CFLAGS_C) -o [email protected] -c $< $(MAKEDEP) $(INCLUDES) 
COMPILE_cpp = g++ $(CFLAGS) -o [email protected] -c $< $(MAKEDEP) $(INCLUDES) 
COMPILE_rc = windres $(RCFLAGS) -J rc -O coff -i $< -o [email protected] -I$(dir $<) 

%.o : %.c ; $(COMPILE_c) 
%.o : %.cpp ; $(COMPILE_cpp) 
%.o : %.cxx ; $(COMPILE_cpp) 
%.o : %.rc ; $(COMPILE_rc) 
.SUFFIXES: .o .d .c .cpp .cxx .rc 

all: all.before all.targets all.after 

all.before : 
    - 
all.after : $(FIRST_TARGET) 

# ----------------------------------------------------------- 
ifeq "$(shell uname)" "Linux" 
# ----------------------------------------------------------- 

all.targets : Linux_Dynamic_target Linux_Static_target 

# ----------------------------------------------------------- 
else 
# ----------------------------------------------------------- 

all.targets : Windows_Dynamic_target 

# ----------------------------------------------------------- 
endif 
# ----------------------------------------------------------- 

clean : 
    rm -fv $(clean.OBJ) 
    rm -fv $(DEP_FILES) 

.PHONY: all clean distclean 

# ----------------------------------------------------------- 
ifeq "$(shell uname)" "Linux" 
# ----------------------------------------------------------- 

# ----------------------------------------- 
# Linux_Dynamic_target 

Linux_Dynamic_target.BIN = libs/libperformer-1.so 
Linux_Dynamic_target.OBJ = src/analysis/analyzer.o src/analysis/comparer.o src/analysis/paverage.o src/analysis/pfunctor.o src/analysis/pmax.o src/analysis/pmin.o src/config/configfile.o src/data_collection/datacollector.o src/data_collection/linux/linfactory.o src/data_collection/linux/linmemprof.o src/data_collection/linux/lintimer.o src/data_collection/linux/procsmaps.o src/data_collection/linux/procstatus.o src/data_collection/pstructs.o src/data_collection/resultxml.o 
DEP_FILES += src/analysis/analyzer.d src/analysis/comparer.d src/analysis/paverage.d src/analysis/pfunctor.d src/analysis/pmax.d src/analysis/pmin.d src/config/configfile.d src/data_collection/datacollector.d src/data_collection/linux/linfactory.d src/data_collection/linux/linmemprof.d src/data_collection/linux/lintimer.d src/data_collection/linux/procsmaps.d src/data_collection/linux/procstatus.d src/data_collection/pstructs.d src/data_collection/resultxml.d 
clean.OBJ += $(Linux_Dynamic_target.BIN) $(Linux_Dynamic_target.OBJ) 

Linux_Dynamic_target : Linux_Dynamic_target.before $(Linux_Dynamic_target.BIN) Linux_Dynamic_target.after_always 
Linux_Dynamic_target : CFLAGS += -Wall -g -Os 
Linux_Dynamic_target : INCLUDES += 
Linux_Dynamic_target : RCFLAGS += 
Linux_Dynamic_target : LDFLAGS += $(CREATE_LIB) $(CREATE_DEF) 
Linux_Dynamic_target : T_LDLIBS = 
ifdef LMAKE 
Linux_Dynamic_target : CFLAGS -= -O1 -O2 -g -pipe 
endif 

Linux_Dynamic_target.before : 


Linux_Dynamic_target.after_always : $(Linux_Dynamic_target.BIN) 

$(Linux_Dynamic_target.BIN) : $(Linux_Dynamic_target.OBJ) 
    $(LINK_dll) 

# ----------------------------------------- 
# Linux_Static_target 

Linux_Static_target.BIN = libs/libperformer-1.a 
Linux_Static_target.OBJ = src/analysis/analyzer.o src/analysis/comparer.o src/analysis/paverage.o src/analysis/pfunctor.o src/analysis/pmax.o src/analysis/pmin.o src/config/configfile.o src/data_collection/datacollector.o src/data_collection/linux/linfactory.o src/data_collection/linux/linmemprof.o src/data_collection/linux/lintimer.o src/data_collection/linux/procsmaps.o src/data_collection/linux/procstatus.o src/data_collection/pstructs.o src/data_collection/resultxml.o 
DEP_FILES += src/analysis/analyzer.d src/analysis/comparer.d src/analysis/paverage.d src/analysis/pfunctor.d src/analysis/pmax.d src/analysis/pmin.d src/config/configfile.d src/data_collection/datacollector.d src/data_collection/linux/linfactory.d src/data_collection/linux/linmemprof.d src/data_collection/linux/lintimer.d src/data_collection/linux/procsmaps.d src/data_collection/linux/procstatus.d src/data_collection/pstructs.d src/data_collection/resultxml.d 
clean.OBJ += $(Linux_Static_target.BIN) $(Linux_Static_target.OBJ) 

Linux_Static_target : Linux_Static_target.before $(Linux_Static_target.BIN) Linux_Static_target.after_always 
Linux_Static_target : CFLAGS += -Wall -g -Os 
Linux_Static_target : INCLUDES += 
Linux_Static_target : RCFLAGS += 
Linux_Static_target : LDFLAGS += $(CREATE_DEF) 
Linux_Static_target : T_LDLIBS = 
ifdef LMAKE 
Linux_Static_target : CFLAGS -= -O1 -O2 -g -pipe 
endif 

Linux_Static_target.before : 


Linux_Static_target.after_always : $(Linux_Static_target.BIN) 

$(Linux_Static_target.BIN) : $(Linux_Static_target.OBJ) 
    $(LINK_lib) 


# ----------------------------------------- 

# ----------------------------------------------------------- 
else 
# ----------------------------------------------------------- 

# ----------------------------------------- 
# Windows_Dynamic_target 

Windows_Dynamic_target.BIN = libs/performer-1.so 
Windows_Dynamic_target.OBJ = src/analysis/analyzer.o src/analysis/comparer.o src/analysis/paverage.o src/analysis/pfunctor.o src/analysis/pmax.o src/analysis/pmin.o src/config/configfile.o src/data_collection/datacollector.o src/data_collection/pstructs.o src/data_collection/resultxml.o src/data_collection/windows/winfactory.o src/data_collection/windows/wintimer.o 
DEP_FILES += src/analysis/analyzer.d src/analysis/comparer.d src/analysis/paverage.d src/analysis/pfunctor.d src/analysis/pmax.d src/analysis/pmin.d src/config/configfile.d src/data_collection/datacollector.d src/data_collection/pstructs.d src/data_collection/resultxml.d src/data_collection/windows/winfactory.d src/data_collection/windows/wintimer.d 
clean.OBJ += $(Windows_Dynamic_target.BIN) $(Windows_Dynamic_target.OBJ) 

Windows_Dynamic_target : Windows_Dynamic_target.before $(Windows_Dynamic_target.BIN) Windows_Dynamic_target.after_always 
Windows_Dynamic_target : CFLAGS += -Wall -g -Os 
Windows_Dynamic_target : INCLUDES += 
Windows_Dynamic_target : RCFLAGS += 
Windows_Dynamic_target : LDFLAGS += $(CREATE_LIB) $(CREATE_DEF) 
Windows_Dynamic_target : T_LDLIBS = 
ifdef LMAKE 
Windows_Dynamic_target : CFLAGS -= -O1 -O2 -g -pipe 
endif 

Windows_Dynamic_target.before : 


Windows_Dynamic_target.after_always : $(Windows_Dynamic_target.BIN) 

$(Windows_Dynamic_target.BIN) : $(Windows_Dynamic_target.OBJ) 
    $(LINK_dll) 

ifdef MAKE_DEP 
-include $(DEP_FILES) 
endif 

# ----------------------------------------------------------- 
endif 
# 

Répondre

1

Je ne pense pas qu'il y ait une différence. C'est juste un makefile sous un nom différent.

Tentez de modifier votre question et l'affichage le contenu de fichier .mak et ce sera plus clair pour nous alors

+0

Ouais désolé, j'écris depuis un autre endroit maintenant, donc je n'ai pas de fichier .mak avec moi, mais je vais poster quelque chose le long des lignes –

+0

@iQ De ce que vous avez posté qui ressemble à un Makefile, juste un avec un nom différent. – Glen

+0

Donc, l'utilitaire nmake de Microsoft va heureusement exécuter le fichier .mak que j'ai généré? Et si le fichier .mak veut aussi compiler avec MinGW ainsi que VC++, l'utilitaire nmake se plaindra-t-il? Ou y a-t-il de meilleurs outils? –

0

Je beleive la réponse de Glen est incorrect en tant que fichiers Mak et mk (faire) ne sont pas du tout même. Ils sont tous les deux utilisés dans l'automatisation des builds mais c'est là que s'arrête la similarité.

fichier MAK est une norme Microsoft qui peut être construit avec la commande suivante sur une invite de commande Visual Studio:

nmake /f NAMEOFfile.mak 

nmake fait partie de Visual Studio et la synthaxe du fichier mak/structure sera différente aussi de mk (make) fichiers.

Les fichiers Make ou mk sont principalement utilisés dans les versions Linux avec certaines instances de prise en charge de Cross Platform (à condition que le Dev soit compatible avec Windows).Pour créer un fichier mk, vous devez utiliser Autotools ou CMake (ces outils sont disponibles sous Windows et Linux). Les fichiers mk seront également accompagnés d'un script configure qui doit être exécuté avant l'étape make ce qui n'est pas le cas pour mak/nmake.

Questions connexes