在bcm97313上跑libtomcrypto (上)——makefile重写

在bcm97313上跑libtomcrypto (上)——makefile重写

分享
标签: 技术  体会  2009-12-29 19:29

    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)


【libtomcrypt/makefile】:
CRYPTO_LIBNAME = libtomcrypt
CRYPTO_HEADER_PATH_SUFF = src/headers/
CRYPTO_OBJS_EXCLUDED_LIST = aes_tab.o twofish_tab.o rc5.o rc6.o sha224.o sha384.o whirltab.o sober128tab.o
CRYPTO_EXTERNAL_LIB = ../../libtommath/export/lib/libtommath.lib
include ../crypto.def
CFLAGS += -I./src/headers/ -I../libtommath/
CFLAGS += -DLTC_SOURCE -DLTC_EASY -DENDIAN_LITTLE -DENDIAN_32BITWORD -DLTC_NO_TEST
src/ciphers/aes/aes_enc.o: src/ciphers/aes/aes.c src/ciphers/aes/aes_tab.c
$(CC) $(CFLAGS) -DENCRYPT_ONLY -c src/ciphers/aes/aes.c -o src/ciphers/aes/aes_enc.o
src/ciphers/aes/aes.o: src/ciphers/aes/aes.c src/ciphers/aes/aes_tab.c
src/ciphers/twofish/twofish.o: src/ciphers/twofish/twofish.c src/ciphers/twofish/twofish_tab.c
src/hashes/whirl/whirl.o: src/hashes/whirl/whirl.c src/hashes/whirl/whirltab.c
src/hashes/sha2/sha512.o: src/hashes/sha2/sha512.c src/hashes/sha2/sha384.c
src/hashes/sha2/sha256.o: src/hashes/sha2/sha256.c src/hashes/sha2/sha224.c
default: $(LIBNAME)

http://tkoc.blog.sohu.com/140844944.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值