libtomcrypto的原作者使用perl脚本辅助生成makefile中的OBJ列表,也许是为了向下兼容早期的make程序。Anyway,不管了。我想办法把makefile重写成gnu-make v3.80支持的格式,希望达到简洁明了的工程管理。
1。消化原makefile,做到心里有数,有的放矢:
1-1。原makefile的主要终结目标是.a,依赖的是一堆.o文件,而这些.o文件一般是由通用规则从对应的.c文件生成的;也有极其个别的是由特殊规则从某些.c文件生成的。
【使用的shell/make命令】:
makefile:
...
OBJ=src/a1.o src/a2.o ...
...
test:
@echo $(notdir $(OBJECTS))
#make test
1-2。从所有.o文件反向找出对应的.c文件,再把这些.c文件和当前文件系统里存在的.c文件比较:哪些是被excluded的,哪些是会被多次利用的(当然是加以不同的编译选项),其他的都是一一对应的生成。
【使用的shell/make命令】:
#make test|sed -e 's/\ /\n/g'|sort|uniq -D;是否存在不同文件夹的.o文件有同名的!
#make test|sed -e 's/\ /\n/g'|sort|sed -e 's/\.o/\.c/g'>o_list.c
#find ./src/ -name "*.c" -printf "%f\n"|sort|uniq -D;是否存在不同文件夹的.c文件有同名的!
#find ./src/ -name "*.c" -printf "%f\n"|sort>c_list.c
#diff c_list.c o_list.c
1-3。解析.c文件到.o文件间的生成规则:CFLAG(分类出pre-/compiler option,macro definition for source code and header file path)和LFLAG (linker option)。
【值得一提】:
libtomcrypto使用的一个字符串crypt_build_settings来打印当前系统的macro definition for source code。这是个值得学习的办法。
const char *crypt_build_settings =
"LibTomCrypt " SCRYPT " (Tom St Denis, tomstdenis@gmail.com)\n"
"LibTomCrypt is public domain software.\n"
"Built on " __DATE__ " at " __TIME__ "\n\n\n"
"Endianess: "
#if defined(ENDIAN_NEUTRAL)
"neutral\n"
#elif defined(ENDIAN_LITTLE)
"little"
...
1-4。找出pre-/compiler option和linker option从旧平台编译器到新平台编译器的可能的对等替换,例如-fsigned-char -falign1 -finl-functions。(尽管这是个高技术含量的事情,但一般可以被放到不太紧急的优先级。因为库的原作者为了可移植性,本身都会尽量把设计得不依赖具体平台,即便是对某个平台的定制或者优化都是通过-DXXX在macro definition来重新规范source code来实现的。所以可以大胆的说,那些基于某个编译器的options,一般都是那个平台的移植者后来添加上的,一开始大胆的忽略吧,当然得记着这么回事。)
1-5。从库使用手册或者readme中找出,基本的#make -f makefile "CFLAG=XXX" "INC_PATH=YYY"的主要环境变量CFLAG等的初始值。(尤其是原makefile中一开始就是以+=赋值的环境变量。)
2。重写makefile,使用默认规则和自动变量,以及高版本makefile的查找替换函数调用。
2-1。crypto.def
2-2。libtomcrypt/makefile 和libtommath/makefile (都分别包含了crypto.def)
【cryto.def】:
#macro for architure
include xxx.def
include yyy.def
include zzz.def #architure compiler options
LIBAR =sde-ar crs
LIBCP=cp -f
LIBRM=rm -fr
LIBMV=mv -f
vpath %o ./obj/
vpath %c $(shell find ./src/ -type d)
#HEADERS = $(shell find ./$(CRYPTO_HEADER_PATH_SUFF) -name "*.h")
HEADERS = $(wildcard ./$(CRYPTO_HEADER_PATH_SUFF)*.h)
SOURCES = $(notdir $(shell find ./src/ -name "*.c"))
PRE_OBJECTS = $(SOURCES:.c=.o)
OBJECTS = $(filter-out $(CRYPTO_OBJS_EXCLUDED_LIST), $(PRE_OBJECTS))
$(CRYPTO_LIBNAME): $(OBJECTS)
cd ./obj; $(LIBAR) $@_tmp.lib $(OBJECTS) $(CRYPTO_EXTERNAL_LIB)
$(LIBCP) ./obj/$@_tmp.lib ./export/lib/$@.lib
$(LIBCP) $(HEADERS) ./export/inc/
%.o: %.c
@echo '$(CC) $(notdir $<)'
@$(CC) $(CFLAGS) -MMD -c $< -o ./obj/$@
@$(LIBMV) $(@:.o=.d) ./obj
clean:
$(LIBRM) obj/* export/lib/$(CRYPTO_LIBNAME).lib export/inc/*.h
debug:
echo $(HEADERS)
echo $(CRYPTO_HEADER_PATH_SUFF)
【libtommath/makefile】:
CRYPTO_LIBNAME = libtommath
include ../crypto.def
CFLAGS += -I./ -DMP_16BIT
default: $(LIBNAME)
http://tkoc.blog.sohu.com/140844944.html