Makefile и .Mak File + CodeBlocks и VStudio

Я немного новичок во всей концепции make-файла, поэтому у меня есть несколько вопросов по ней.

Я создаю проект с использованием CodeBlocks в Linux, я использовал инструмент cbp2mak для создания файла .make из проекта CodeBlocks (если кто-нибудь знает инструмент получше, дайте мне знать).

Теперь я не уверен, в чем разница между .mak и .makefile, может ли кто-нибудь мне сказать? Я могу скомпилировать .mak с помощью make -C .mak, но в чем разница?

Причина, по которой я пытаюсь его использовать, заключается в том, что я хочу предоставить исходный код для своего проекта и хочу, чтобы он мог быть собран как в Linux, так и в Windows, поэтому я не хочу передавать им свой файл проекта кодовых блоков. Поэтому я подумал, что могу использовать make-файл, который можно использовать для сборки как в Linux, так и в Windows.

Я также хотел бы проверить в Windows, существует ли компилятор MinGW и VC ++, и собрать исходный код с обоими компиляторами, в Linux это будет только с GNU GCC.

В файле .mak также есть несколько макросов для определения того, что создавать, в зависимости от того, запускается ли он в Windows или Linux, поскольку существуют файлы для конкретной платформы.

Итак, вопросы:

-В чем разница между .mak и .makefile

-Могу ли я запустить файл .mak в Windows? скажите, используя визуальную студию?

-Могло ли быть лучшее решение для того, что я делаю сейчас? (Я использовал cpb2mak, поскольку он автоматически генерирует файл .mak, что экономит много времени, так как я не знаю, как создавать файлы сборки)

Также не стесняйтесь давать какие-либо советы или подсказки по этому поводу.

РЕДАКТИРОВАТЬ:

Я установил полный файл .mak

Также мой проект представляет собой библиотеку, в которой я создаю как статические, так и общие версии. Файл .mak был сгенерирован автоматически, но я использовал дескриптор платформы с помощью ifdef и shell, uname function.

# 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 $@ -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 $@ $^ $(LDFLAGS) $(LDLIBS)
LINK_con = gcc -o $@ $^ $(LDFLAGS) $(LDLIBS)
LINK_dll = gcc -o $@ $^ $(LDFLAGS) $(LDLIBS) -shared
LINK_lib = rm -f $@ && ar rcs $@ $^
COMPILE_c = gcc $(CFLAGS_C) -o $@ -c $< $(MAKEDEP) $(INCLUDES)
COMPILE_cpp = g++ $(CFLAGS) -o $@ -c $< $(MAKEDEP) $(INCLUDES)
COMPILE_rc = windres $(RCFLAGS) -J rc -O coff -i $< -o $@ -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
#

person iQ.    schedule 17.09.2009    source источник


Ответы (2)


Я полагаю, что ответ Глена неверен, поскольку файлы mak и mk (make) совсем не одно и то же. Оба они используются при автоматизации сборок, но на этом сходство заканчивается.

Файл .mak - это стандарт Microsoft, который можно создать с помощью следующей команды из командной строки Visual Studio:

nmake /f NAMEOFfile.mak

nmake является частью Visual Studio, и синтаксис / структура mak-файла также будет отличаться от mk (make) файлов.

Файлы make или mk в основном используются в сборках Linux с некоторыми экземплярами кроссплатформенной поддержки (при условии, что Dev поддерживает Windows). Для создания файла mk вам понадобится Autotools или CMake (эти инструменты доступны как в Windows, так и в Linux). Файлы mk также будут сопровождаться сценарием настройки, который необходимо запустить перед шагом make, что не относится к mak / nmake.

person thebunnyrules    schedule 12.02.2017
comment
cbp2make может создавать файлы .mak для разных платформ, проверьте здесь: sourceforge.net/p/cbp2make/ wiki / Home Я думаю, что для Linux сгенерированные файлы .mak являются обычными Makefile. - person ggurov; 09.03.2021

Не думаю, что есть разница. Это просто make-файл с другим именем.

Попробуйте отредактировать свой вопрос и опубликовать содержимое файла .mak, и тогда нам станет понятнее

person Glen    schedule 17.09.2009
comment
Да, извините, я сейчас пишу откуда-то еще, поэтому у меня нет файла .mak, но я опубликую что-нибудь по строкам - person iQ.; 17.09.2009
comment
@iQ Судя по тому, что вы опубликовали, он выглядит как Makefile, только один с другим именем. - person Glen; 17.09.2009
comment
Значит, утилита nmake от Microsoft с радостью запустит созданный мной файл .mak? Что, если файл .mak также нужно компилировать с MinGW, а также с VC ++, будет ли утилита nmake жаловаться? Или есть инструменты получше? - person iQ.; 17.09.2009
comment
Некоторые make-файлы относятся к определенным программам make. например, pmake и стандартный make, похоже, имеют проблемы с запуском make-файлов, нацеленных друг на друга. Что говорится в документации по cbp2mak (если есть)? - person Glen; 17.09.2009
comment
к сожалению, документации не так много, только readme, рассказывающий, как ее использовать. Он просто генерирует файл .mak, которого я не публиковал выше. Честно говоря, я не понимаю большей части этого, поэтому я не уверен, будет ли он работать в Windows. Я не уверен в какой-либо хорошей многоплатформенной системе сборки, Linux является основной целью, поэтому было бы идеально иметь систему make, совместимую с GNU. Что насчет cmake? генерирует ли это make-файл, который можно записать в make-системе GNU? Или пользователю нужно установить cmake, чего я пытаюсь избежать. - person iQ.; 17.09.2009