makefile统一管理项目

之前提到过,为了整理方便,新的项目将采用统一的规划。前两天正好找了一点点空闲,就整理了下。

规划是这个样子的:

1.从project.txt文件中读取项目的目录,每个项目为一行,对项目不做重复性判断。

2.对读出来的每个项目目录,进入到目录中,执行make。

3.默认执行项目的默认编译目标,但需要支持统一编译的某些特定目标,比如项目文档的生成。

4.所有生成的文件需要放入到指定的目录中。目录结构和项目目录结构除去盘符一样。比如对于brew的一个test项目,项目的目录结构为X:/brew/test,指定的生成位置为Y:/prj_bin下,则生成之后的文件放在Y:/prj_bin/brew/test中,再深的目录结构和单独编译某个项目的生成的目录结构一样。

5.命令行中要支持常用变量的自定义


首先看代码:

       
PROJECT_FILE ?= "f:/project.txt"
PROJECT ?= $(shell cat $(PROJECT_FILE))
RIX_BIN ?= "f:/prj_bin"
RIX_OUT ?= "f:/prj_out"
ADD_OPT ?= 
all:
	echo -e "$(OUTDIR)\n $(RIX_OUT) \n $(TEMP_OUTDIR) $(PROJECT)"
	for a in ${PROJECT}; \
	do \
	if [[ -d $${a} ]]; \
	then \
        make one -e PROJECT=$${a} ADD_OPT=$(ADD_OPT); \
    else \
        echo "$${a} not exist!"; \
    fi; \
	done; \

one:
	echo $(shell echo $(PROJECT) | sed  's/\([a-z]\)://')
	cd $(PROJECT) && echo -e "$(PROJECT)" && export RIX_BIN="$(shell echo $(RIX_BIN))$(shell echo $(PROJECT) | sed  's/\([a-z]\)://')"; export RIX_OUT=$(RIX_OUT);make $(ADD_OPT)
       

all部分没啥好说的,之前的svn自动提交的代码稍作修正来的,太简单了,也可以说是从随便的一个for循环中过来的。

one部分是具体编译某个项目,进入到项目目录,然后定义下特殊的变量,然后make目标。那个正则表达式为去掉项目的盘符。

看起来还可以,这样当整个项目被整理到某个只可读的介质中,比如光盘,可以进入目录,指定生成的目录和临时文件生成的目录,然后编译就可以了,不用将项目复制出来。

但在我的实际项目中,则有点复杂。主要原因是由于系统内码造成的,我经常要在英文,中文,日文的内码之间切换,这样当目录中存在有非英文文字的时候,经常会出现路径无法识别的问题,因此,实际项目的编译脚本中对此做了一些处理,使其尽可能的避免路径问题,虽然修改也是可以的,但量比较大,而且还要不断测试等等,最简单的办法就是使用链接的方式,当然,这样就放弃了一些特性了,不过我个人还是可以承受的。

linux的ln非常好用,可惜windows没有,cygwin的那个弄出来不认,不过,我从微软的网站上找了一个工具:junction,这个东东可以做链接,不论是cygwin还是其他的任何软件都可以认为文件真的存在。不过如果你真的删掉链接里面的文件夹的话,貌似原始目录中也会被删除(貌似这样)。

发布者

rix

如果连自己都不爱自己,哪还有谁来爱你

  • linux的makefile至今还是搞不懂。

    • rix

      有一个gnu make的中文帮助,很不错的。基本上可以结局解决碰到的90%的问题