免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3033 | 回复: 5
打印 上一主题 下一主题

makefile(8) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2002-07-09 09:19 |只看该作者 |倒序浏览
标  题: 关于makefile(

2.8 一个更好的 makefile
这是一个我为我大多数项目设计的 makefile 。它应该可以不需要修 改的用在大部分项目里。我主要把它用在 djgpp 上,那是一个 DOS 版的 gcc 编译器。因此你可以看到执行的命令名、 'alleg' 程序包、 和 RM -F 变量都反映了这一点。
=== makefile 开始 ===
######################################
#
# Generic makefile
#
# by George Foot
# email: george.foot@merton.ox.ac.uk
#
# Copyright (c) 1997 George Foot
# All rights reserved.
# 保留所有版权
#
# No warranty, no liability&#59;
# you use this at your own risk.
# 没保险,不负责
# 你要用这个,你自己担风险
#
# You are free to modify and
# distribute this without giving
# credit to the original author.
# 你可以随便更改和散发这个文件
# 而不需要给原作者什么荣誉。
# (你好意思?)
#
######################################
### Customising
# 用户设定
#
# Adjust the following if necessary&#59; EXECUTABLE is the target
# executable's filename, and LIBS is a list of libraries to link in
# (e.g. alleg, stdcx, iostr, etc). You can override these on make's
# command line of course, if you prefer to do it that way.
#
# 如果需要,调整下面的东西。 EXECUTABLE 是目标的可执行文件名, LIBS
# 是一个需要连接的程序包列表(例如 alleg, stdcx, iostr 等等)。当然你
# 可以在 make 的命令行覆盖它们,你愿意就没问题。
#
EXECUTABLE := mushroom.exe
LIBS := alleg
# Now alter any implicit rules' variables if you like, e.g.:
#
# 现在来改变任何你想改动的隐含规则中的变量,例如
CFLAGS := -g -Wall -O3 -m486
CXXFLAGS := $(CFLAGS)
# The next bit checks to see whether rm is in your djgpp bin
# directory&#59; if not it uses del instead, but this can cause (harmless)
# `File not found' error messages. If you are not using DOS at all,
# set the variable to something which will unquestioningly remove
# files.
#
# 下面先检查你的 djgpp 命令目录下有没有 rm 命令,如果没有,我们使用 del 命令来代替,但有可能给我们 'File not found' 这个错误信息,这没 # 什么大碍。如果你不是用 DOS ,把它设定成一个删文件而不废话的命令。  (其实这一步在 UNIX 类的系统上是多余的,只是方便 DOS 用户。 UNIX  用户可以删除这5行命令。)

ifneq ($(wildcard $(DJDIR)/bin/rm.exe),)
RM-F := rm -f
else
RM-F := del
endif
# You shouldn't need to change anything below this point.
#
# 从这里开始,你应该不需要改动任何东西。(我是不太相信,太NB了!)
SOURCE := $(wildcard *.c) $(wildcard *.cc)
OBJS := $(patsubst %.c,%.o,$(patsubst %.cc,%.o,$(SOURCE)))
DEPS := $(patsubst %.o,%.d,$(OBJS))
MISSING_DEPS := $(filter-out $(wildcard $(DEPS)),$(DEPS))
MISSING_DEPS_SOURCES := $(wildcard $(patsubst %.d,%.c,$(MISSING_DEPS)) \
$(patsubst %.d,%.cc,$(MISSING_DEPS)))
CPPFLAGS += -MD
..PHONY : everything deps objs clean veryclean rebuild
everything : $(EXECUTABLE)
deps : $(DEPS)
objs : $(OBJS)
clean :
@$(RM-F) *.o
@$(RM-F) *.d
veryclean: clean
@$(RM-F) $(EXECUTABLE)
rebuild: veryclean everything
ifneq ($(MISSING_DEPS),)
$(MISSING_DEPS) :
@$(RM-F) $(patsubst %.d,%.o,$@)
endif
-include $(DEPS)
$(EXECUTABLE) : $(OBJS)
gcc -o $(EXECUTABLE) $(OBJS) $(addprefix -l,$(LIBS))
=== makefile 结束 ===
有几个地方值得解释一下的。首先,我在定义大部分变量的时候使 用的是 := 而不是
= 符号。它的作用是立即把定义中参考到的函 数和变量都展开了。如果使用 = 的话,
函数和变量参考会留在那 儿,就是说改变一个变量的值会导致其它变量的值也被改
变。例 如:
A = foo
B = $(A)
# 现在 B 是 $(A) ,而 $(A) 是 'foo' 。
A = bar
# 现在 B 仍然是 $(A) ,但它的值已随着变成 'bar' 了。
B := $(A)
# 现在 B 的值是 'bar' 。
A = foo
# B 的值仍然是 'bar' 。
make 会忽略在 # 符号后面直到那一行结束的所有文字。
ifneg...else...endif 系统是 makefile 里让某一部分码有条件的 失效/有效的工
具。 ifeq 使用两个参数,如果它们相同,它把直 到 else (或者 endif ,如果没有

else 的话)的一段码加进 makefile 里;如果不同,把 else 到 endif 间的一段码加入 makefile (如果有 else )。 ifneq 的用法刚好相反。 'filter-out' 函数使用两个用空格分开的列表,它把第二列表中所 有的存在于第一列 表中的项目删除。我用它来处理 DEPS 列表,把所 有已经存在的项目都删除,而只保留缺少的那些。
我前面说过, CPPFLAGS 存有用于隐含规则中传给预处理器的一些 旗标。而 -MD 开关 类似 -M 开关,但是从源码文件 .c 或 .cc 中 形成的文件名是使用后缀 .d 的(这就 解释了我形成 DEPS 变量的 步骤)。DEPS 里提到的文件后来用 '-include' 加进了 makefile 里,它隐藏了所有因文件不存在而产生的错误信息。 如果任何依靠文件不存在, makefile 会把相应的 .o 文件从磁碟 上删除,从而使得 make 重建它。因为 CPPFLAGS 指定了 -MD , 它的 .d 文件也被重新产生。 最后, 'addprefix' 函数把第二个参数列表的每一项前缀上第一 个参数值。 这个 makefile 的那些目的是(这些目的可以传给 make 的命令行 来直接选用):
everything:(预设) 更新主要的可执行程序,并且为每一个 源码文件生成或更新一个 '.d' 文件和一个 '.o' 文件。 deps: 只是为每一个源码程序产生或更新一个 '.d' 文件。 objs: 为每一个源码程序生成或更新 '.d' 文件和目标文件。 clean: 删除所有中介/依靠文件( *.d 和 *.o )。
veryclean: 做 `clean' 和删除可执行文件。
rebuild: 先做 `veryclean' 然后 `everything' ;既完全重建。
除了预设的 everything 以外,这里头只有 clean , veryclean , 和 rebuild 对用户是有意义的。 我还没有发现当给出一个源码文件的目录,这个 makefile 会失败的 情况,除非依靠 文件被弄乱。如果这种弄乱的情况发生了,只要输入 `make clean' ,所有的目标文件和依靠文件会被删除,问题就应该 被解决了。当然,最好不要把它们弄乱。如果你发现在某种情况下这 个 makefile 文件不能完成它的工作,请告诉我,我会把它整好的。
3 总结
我希望这篇文章足够详细的解释了多文件项目是怎么运作的,也说明了 怎样安全而合理的使用它。到此,你应该可以轻松的利用 GNU Make 工 具来管理小型的项目,如果 你完全理解了后面几个部分的话,这些对于 你来说应该没什么困难。 GNU Make 是一件强大的工具,虽然它主要是用来建立程序,它还有很多 别的用处。如果想要知道更多有关这个工具的知识,它的句法,函数, 和许多别的特点,你应该参
看它的参考文件 (info pages, 别的 GNU 工具也一样,看它们的 info pages. )。

论坛徽章:
0
2 [报告]
发表于 2002-09-18 16:37 |只看该作者

makefile(8)

我的makefile如下:
EXECUTABLE := run_exe
LIB_TAG := ../lib/libsgip.a
LIBS := pthread
INSTALL := mv $(LIB_TAG) ../lib

# Now alter any implicit rules' variables if you like, e.g.:
#
# 现在来改变任何你想改动的隐含规则中的变量,例如

CFLAGS := -g -Wall -O3 -I../include
CXXFLAGS := $(CFLAGS)

# The next bit checks to see whether rm is in your djgpp bin
# directory&#59; if not it uses del instead, but this can cause (harmless)
# `File not found' error messages. If you are not using DOS at all,
# set the variable to something which will unquestioningly remove
# files.
#
# 下面先检查你的 djgpp 命令目录下有没有 rm 命令,如果没有,我们使用
# del 命令来代替,但有可能给我们 'File not found' 这个错误信息,这没
# 什么大碍。如果你不是用 DOS ,把它设定成一个删文件而不废话的命令。

RM:= rm -f

# You shouldn't need to change anything below this point.
#
# 从这里开始,你应该不需要改动任何东西。(我是不太相信,太NB了!)

CC := g++
SOURCE := $(wildcard *.c) $(wildcard *.cc)
OBJS := $(patsubst %.c,%.o,$(patsubst %.cc,%.o,$(SOURCE)))
DEPS := $(patsubst %.o,%.d,$(OBJS))
MISSING_DEPS := $(filter-out $(wildcard $(DEPS)),$(DEPS))
MISSING_DEPS_SOURCES := $(wildcard $(patsubst %.d,%.c,$(MISSING_DEPS)) \
$(patsubst %.d,%.cc,$(MISSING_DEPS)))
CPPFLAGS += -MD

.PHONY : everything deps objs clean veryclean rebuild

everything : $(EXECUTABLE)

deps : $(DEPS)

objs : $(OBJS)

libs : $(OBJS)
ar cru $(LIB_TAG) $(OBJS)

install :
@$(INSTALL)

clean :
@$(RM) *.o
@$(RM) *.d
@$(RM) $(LIB_TAG)

veryclean: clean
@$(RM) $(EXECUTABLE)

rebuild: veryclean everything

ifneq ($(MISSING_DEPS),)
$(MISSING_DEPS) :
@$(RM) $(patsubst %.d,%.o,$@)
endif

-include $(DEPS)

$(EXECUTABLE) : $(OBJS)
g++ -o $(EXECUTABLE) $(OBJS) $(addprefix -l,$(LIBS))
当我在linux7.3中间执行make的时候,出现错误提示如下:
/usr/lib/gcc-lib/i386-redhat-linux/2.96/../../../crt1.o: In function `_start':
/usr/lib/gcc-lib/i386-redhat-linux/2.96/../../../crt1.o(.text+0x1: undefined r
eference to `main'
collect2: ld returned 1 exit status
您能告诉原因吗?谢谢您,我真的很着急
shine1977 该用户已被删除
3 [报告]
发表于 2002-11-16 21:32 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
4 [报告]
发表于 2002-11-18 10:56 |只看该作者

makefile(8)

这是beaver的一个makefile,我觉得比上面的要比较容易理解一些:
能够适用windows及linux/unix!!!
##
## Makefile for Beaver
##
## Author<s>;:   Marc Bevand (aka &quot;After&quot <bevand_m@epita.fr>;
## Last update: Mon Jul 15 22:29:51 CEST 2002
##

############## Public section. Modify according to your needs.  ###############

CC      = gcc
RM      = rm -f
CP      = cp

DESTDIR = /usr/local
IPATH   =
LPATH   =
OPTI    = -O3 -funroll-loops -fomit-frame-pointer #-mcpu=i686
DBUG    = #-ggdb #-pg
WARN= #-W -Wall #-pedantic -ansi

### Unix version ###
CFLAGS  = ${OPTI} ${DBUG} ${WARN} ${IPATH} `gtk-config --cflags`
LDFLAGS = ${OPTI} ${DBUG} ${WARN} ${LPATH} `gtk-config --libs`
NAME    = beaver

### Windows version ###
#CFLAGS  = ${OPTI} ${DBUG} ${WARN} ${IPATH}\
#   -fnative-struct -mwindows
#LDFLAGS = ${OPTI} ${DBUG} ${WARN} ${LPATH}\
#   -lgdk-1.3 -lgtk-1.3 -lgmodule-1.3 -lglib-1.3 -lm
#NAME    = beaver.exe

###################### Private section. Do not modify  ########################

ifndef DBUG
STRIP = strip --strip-all ${NAME}
endif

SRC= main.c search.c tools.c languages.c editor.c prefs.c conf.c msgbar.c\
  toolbar.c interface.c filesops.c completion.c undoredo.c
INC= ${SRC:.c=.h} struct.h wordfile.h
OBJ= ${SRC:.c=.o}

all: ${OBJ}
${CC} -o ${NAME} ${OBJ} ${LDFLAGS}
@${STRIP}

.c.o:
${CC} ${CFLAGS} -c $< -o $@

${OBJ}: ${INC}

install :
install -d $(DESTDIR)/bin
install beaver $(DESTDIR)/bin
install -d $(DESTDIR)/share/beaver/bl
$(CP) ../bl/* $(DESTDIR)/share/beaver/bl
install -d $(DESTDIR)/share/pixmaps
$(CP) ../pixmaps/beaver.png $(DESTDIR)/share/pixmaps
gzip -c9 ../beaver.1x >; ../beaver.1x.gz
install -d $(DESTDIR)/man/man1
$(CP) ../beaver.1x.gz $(DESTDIR)/man/man1
@echo
@echo &quot;Files installed :&quot;
@echo &quot;-----------------&quot;
@echo
@echo &quot;$(DESTDIR)/bin/beaver&quot;
@echo &quot;$(DESTDIR)/share/beaver/bl/example1.bl&quot;
@echo &quot;$(DESTDIR)/share/beaver/bl/example2.bl&quot;
@echo &quot;$(DESTDIR)/share/beaver/bl/glib.bl&quot;
@echo &quot;$(DESTDIR)/share/pixmaps/beaver.png&quot;
@echo &quot;$(DESTDIR)/man/man1/beaver.1x.gz&quot;
@echo
@echo &quot;,----------------------------------.&quot;
@echo &quot;| Beaver succesfully installed ^_^ |&quot;
@echo &quot;\`----------------------------------'&quot;

.PHONY: clean re

clean:
${RM} *~ \#* .\#* *.core gmon.out ../beaver.1x.gz ${OBJ} ${NAME}

re: clean all
dreamflying 该用户已被删除
5 [报告]
发表于 2003-05-01 16:02 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
6 [报告]
发表于 2003-08-30 19:00 |只看该作者

makefile(8)

thank you
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP