makefile优化

以前从未在意过makefile的执行效率,直到最近,由于需要将代码前前后后编译几十遍甚至上百遍,才发现原来的方式实在太慢。

以前的方式:

       ALL ?=
       default: END

       target1:
            cd . && make clean ready ....
       ALL += target1
       target2:
            cd . && make clean ready .....
       ALL += target2
      很多的target
       done:
            @echo done
       END: $(ALL) done
       

这样前前后后编译下来,天哪,竟然要2个小时,想想这样的操作需要3遍,基本上一天就没有了。这实在忍受不了。

make命令支持-j参数,可以并行执行,但上述模式是不可以的。由于调用make命令会将-j参数设置为默认的,因此在最外部调用-j参数无实质性作用

测试一下大致的目标,将所有生成的中间文件的命令完全的写入到一个临时文件中,并在原来的目标中生成临时文件,以便检查依赖性通过,然后在最后一步运行中间文件的命令时使用并行执行。这样时间大幅度的降低为40分钟左右。

继续阅读makefile优化

makefile统一管理项目

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

规划是这个样子的:

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

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

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

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

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

继续阅读makefile统一管理项目

brew 使用 make 生成 mif

brew项目测试中,经常需要改变被测试程序的版本号,每次都需要修改mif文件,每次都要打开mifeditor,很不方便,最好能用makefile来生成,这样可以与程序一起用make控制编译。于是,写了下面的makefile

DIST ?= .
filename ?= test
name ?= "test"
copyright ?= "--==rix==--"
ver ?= $(shell cat ../source/ver.h | echo)
clsid = "0x12300001"
type = ""
privileges = "File Network Web AddressBook"
imported = "0x01028839 0x0103d8e2 0x0103081d"
exec = "../../Tool/ResourceEditor/brewrc.exe"
image = "../../resource/icon/icon32.png ../../resource/icon/icon48.png ../../resource/icon/icon192.png"

all:
	filename=$(filename) name=$(name) copyright=$(copyright) ver=$(ver) clsid=$(clsid) image=$(image) privileges=$(privileges) imported=$(imported) exec=$(exec) type=$(type) ../../Tool/createmif.sh ../../$(DIST)

继续阅读brew 使用 make 生成 mif