本文讨论的是比较流行的嵌入式开发组合ARMuclinux,即目标开发板为
三星S3C4510,完成sqlite在其uclinux上的移植。
, ]( g& E! g n8 P- M
0 b' a% N0 M% g 本文假设你已经具备正确编译uclinux的kernel的能力,即有能力完成makemenuconfig;makedep;makelib_only;makeuser_only;makeromfs;makeimage;make。而且还能将自己写的
类似helloworld
程序加到“
用户自定义应用程序”中,即你能完成“uClinux-dist/Documentation/Adding-User-Apps-HOWTO”中所
描述的“
用户程序的订制”。
7 M ~3 a1 Z' u v" w' p
% ~/ W% t( C' ]2 K3 {' z4 q 大多数需要移植sqlite到uclinux的开发者,应该已经具备上面的能力,而只是不清楚如何修改sqlite来完成其在uclinux下的编译。如果你还不能完成上面的要求,那么请先做一定的准备工作,因为本范例所涉及到的内容主要是跟sqlite在uclinux下的移植有关,其他的在这个过程中出现的问题,开发者需要自行处理。
# p# m: f# j( g1 m
$ i) ~ H% s; {( ] 本范例使用的uclinux是uClinux-dist-20030522.tar.gz,你可以从http://www.uclinux.org得到适合你的
软件包。
. [2 ]! {8 y: r$ y; H
F5 u6 p8 J. T2 E d; P& y1 O
交叉编译工具是arm-elf-tools-20030314.sh,你也可以在http://www.uclinux.org找到它。
9 J/ _, I9 T2 ?. T0 o) g. k
( [% Z+ [4 y4 Z4 |9 U$ ^+ [6 v 本范例使用的sqlite是sqlite-2.8.15.tar.gz,本文的方法也适合于2.8.x系列的sqlite;可能有部分内容不适用于3.0.x系列的sqlite,因为3.0.x中
源代码有较大的变化。
+ X% Z5 |3 G, E5 J2 s# i7 D
" G3 ?8 w: m! c: {6 V 1、
下载sqlite:你可以到http://www.sqlite.org/download.html,
下载sqlite-2.8.15.tar.gz软件包;
7 C9 v8 R: `0 C! k9 Z' x
0 ^- L" ^) g/ n" r
2、将下载的软件包解压缩到uClinux-dist/user目录下;
7 E: ~6 e z' K0 J( C% `! ^6 @$ `
: K* p' }1 a3 R" Q 命令:
/ W6 M' y+ F# v& w" U
! D5 h- L' T7 y$ |
$tarzxvfsqlite-2.8.15.tar.gz-CuClinux-dist/user/
c: ?/ `& d8 @5 S% X4 u7 F6 z1 W
2 d' ~/ E- ^ |* f 现在在uclinux的user目录下,你应该可以看到sqlite目录了。解压缩到这个user目录主要是要将sqlite编译成一个普通的用户应用程序。
' k3 l! W! p1 {8 }& P u) @8 H' R2 L- B7 T% b# R1 X
3、用户应用程序的有关设置:
6 g$ c8 t1 X2 O. K7 w/ s: `) Q
! \1 N1 `' x4 s3 r 按uClinux-dist/Documentation/Adding-User-Apps-HOWTO文档中说提到的,来添加sqlite作为一个用户应用程序,将其做成一个
shell,这样就类似于uclinux自己的ps命令。
& m/ c$ x( L' W+ w$ x
& Z7 V3 n; K( d+ T7 W
编辑文件
8 h' I" J, I4 ]0 `6 S
0 G9 T8 g$ M6 b( K+ h# |6 R7 k
uClinux-dist/user/Makefile
1 ?! U& a4 E* a, x/ I5 g2 x' R
: U! Y6 K( ~6 u3 J1 i2 C: q- n5 {
uClinux-dist/config/Configure.help
8 H/ }2 U7 a X! F0 ]9 B: }4 ]. Z" i6 f9 [' {/ D4 c) u
uClinux-dist/config/config.in
% v3 x. u* T" i/ M- X" n Y1 ` \
+ x# a. ?% |+ u3 a 我是在这些文件里查找“cpu”有关的项,然后在它的下面,加上自己的sqlite项,这个过程并不复杂。
9 E, G- Q# c5 G% `6 T$ M
* x& j9 L C: F8 z/ B2 b3 W 通过上面的修改后,你现在就可以运行uclinux的makemenuconfig,选中“CustomizeVendor/UserSettings”,再选中“MiscellaneousApplications”,可以看到它现在出现了一个新的“sqlite(NEW)”,这个就是我们刚添加进去的sqlite项。
$ L' u" k Q+ i) K5 m! s. R
1 e8 k: W. |$ _0 E 在稍后的makeromfs中,uclinux会将你的sqlite编译进来,做成romfs的一部分,因为你在uClinux-dist/user/Makefile中已经加上要编译sqlite项了。这样在移植后的uclinux的/bin中将会有sqlite命令可以让你来执行。
" r. _/ w0 T3 x# S$ O
8 U4 g6 v# F* ~: c* `6 N 好,现在我们就要对sqlite进行修改,来做移植工作。
! @( G& a: v0 k( Z: M
( P; y& c5 }4 U5 M9 V8 n 在下面的描述中,我们将对以下几个文件进行一定的添加、修改,从而来完成sqlite在uclinux下的编译:
' s2 ^4 i* e3 I# c6 E6 W
/ w& l/ Z0 Q3 w# R: q: ^/ V6 c. g4 E0 s sqlite/main.mk修改
$ S6 U0 r5 I0 E6 |: y) ?; N* d
8 J: U6 J/ M! n9 _ sqlite/Makefile添加
& } R/ |1 s$ s: C9 U* w
G+ p' L5 ^; z5 C- v0 r sqlite/src/os.c修改
$ r6 N( q8 f3 d! T/ n b0 ^
# E+ j: A0 K( V8 Z/ k( Y% \: N sqlite/src/shell.c修改
2 d; y, G5 m) ~; Q2 }% \
. s6 R+ I1 q; z; K+ j" p0 E
对这几个文件进行修改时,请自己做好这些文件的备份,比如你可以将它们拷贝一份,改名成文件名后面带.bak。这个很重要,可以避免你在修改的过程出现问题而无法还原。
4 P' M. w$ A& w `
/ \% b8 f$ @6 _9 h 一、修改sqlite/main.mk3 ]4 W p% _/ O* n; Y$ p: e0 b
6 P- N! {* j, a
1、TCCX
+ k: w, p; T- p9 ^ j
( N5 B( E, i5 T0 M. ~
将
0 e) ~! ~' U* e: S, H1 K$ V5 v
+ [" p6 c, p1 R; f0 y! f
TCCX=$(TCC)$(OPTS)$(THREADSAFE)$(USLEEP)-I.-I$(TOP)/src
2 P3 E2 a& ]8 n% d; k$ T$ c7 l! Z3 p- }; O3 W! p
修改为
. {! z9 y" }* N9 d/ w: e! e# s
8 A3 D/ i5 P. o3 Z1 U6 u
TCCX=$(TCC)$(OPTS)$(THREADSAFE)$(USLEEP)-I.-I$(TOP)/src$(CFLAGS)
# N( p( r( v! k
* Y# I; U4 L5 E) D
即加上$(CFLAGS)标记。
n7 p" X9 S" o# \- _# \
5 C# S0 i+ X7 Q) x" f A6 n3 J! O 2、LIBOBJ
2 _: p+ Z# p8 V' E3 G( r6 @3 V9 `
! }3 q$ o, L1 m. u6 w- o. |
找到#Objectfilesforthe
SQLitelibrary.
# m. z+ b e2 W7 m/ T* A
[color=#FFFFFF']
& D8 W6 H8 j3 j- f; m' o
! l4 R r) ]! t8 ~) m
! s: @+ u! ]1 f. L3 ]
将其中的tclsqlite.o去掉。即去掉tcl有关的东西。
6 h+ @1 K5 f+ e8 e
9 X/ n- q" z. T q6 M 如果没有tclsqlite.o,那么不用处理它。
) c) A, l9 [' d
0 O2 A# E6 r" Y; { 3、sqlite$(EXE)
8 W7 W( P6 U" b5 b% q! M7 t; }) w
& ?3 G9 n; T D: K, `) J: ~: U
找到类似sqlite$(EXE)的一句,将:
+ i5 s. P+ V8 y1 ?! b1 `
4 M8 y9 {! |8 C- C7 p
sqlite$(EXE)

(TOP)/src/shell.clibsqlite.asqlite.h
3 }7 ^9 j* C3 }4 q9 W
( }, L. L& e" v) v $(TCCX)$(READLINE_FLAGS)-osqlite$(EXE)$(TOP)/src/shell.c\\\\\\\\
/ y2 }' e; d/ h8 ?
" p- s9 \; w$ B5 z! Z) f! y) r% i libsqlite.a$(LIBREADLINE)$(THREADLIB)
4 {" q6 I- Q5 ]9 ]. ~* q8 s- S9 J1 ~. x+ n8 F# d. K. Q8 r8 I/ L
替换为:
( n. I: J7 h# q! n: M/ ?
! p* J2 t! e; j: o" a
shell.o

(TOP)/src/shell.csqlite.h
+ i: L5 |/ o- W3 i& g
9 |; f" H7 ~4 b& x9 z9 ~ $(TCCX)$(READLINE_FLAGS)-c$(TOP)/src/shell.c
) N- j3 J6 K s$ V
# U4 `. ], u9 j4 E
sqlite$(EXE):shell.olibsqlite.a
: g% n( Z; B( S' U5 ]5 E. p! g4 [
$(TCC)$(LDFLAGS)-o$@shell.o\\\\\\\\
4 ]' _. k" x( n1 ~& w) u
3 d+ ^' k2 F* B5 A2 k! w libsqlite.a$(LIBREADLINE)$(THREADLIB)$(LDLIBS)
3 j0 e) l1 c w* I2 J
9 M# B3 f% g0 x3 x( s) R
即在sqlite$(EXE)上一行加上shell.o,及在其后加上$(LDLIBS)标记。这个是对/src/shell.c的编译方法的修改。
* s, t2 T! a& ^3 \# m4 H
1 n; k3 t/ Z, U- r6 |+ g- [ 4、romfs
7 U; b4 N$ P1 h4 q5 h% C
1 a3 B6 U, \/ [3 \) n 将:
- g& r1 c' j4 |( {: ^4 I
% r/ ^* Y# Q( v5 U- |: y install:sqlitelibsqlite.asqlite.h
4 m, x3 |$ x- D h; L5 F4 ?1 R
6 M1 n$ [: |% D- _ mvsqlite/usr/bin
( z; A0 A+ D4 b
" b' \$ H M5 a$ z5 B( O mvlibsqlite.a/usr/lib
" I! @5 V4 E! [9 D
g6 c$ k) I0 e$ _ mvsqlite.h/usr/include
/ p' b4 C# U' I7 z
. [, r3 S2 r. p+ L& Y1 T# _
替换为:
. b* \7 n& h( Y* S/ N
: H+ r5 z3 Y) `6 e) Y: @9 u& j romfs:sqlite
! s1 {( r' p+ W' Q# T6 ?: P( S
& c- ?3 }# m0 X/ n1 F/ ]' i, I $(ROMFSINST)/bin/sqlite
7 n& J: S% K: H- [/ C% o/ f+ u0 s7 y7 a; Q! A& r
即去掉makeinstall项,加上makeromfs项。这个很重要,这将在romfs的/bin目录下生成sqlite。
$ i; Y. k& U. [, o+ O2 m# K0 t7 {; z; j5 a% U) g
5、clean
1 r& q( C, ?; M4 S
6 n T. q0 m4 @+ C* T
将:
M. q3 \! \% P7 W, @3 C+ r- C
, M3 g6 w/ T u clean:
1 b3 `9 Q$ ?; c
) E+ k2 @) R0 j1 e b
rm-f*.osqlitelibsqlite.asqlite.hopcodes.*
- p0 a3 z: ?# L) F2 ^' K# M: p
h% e% z2 v l rm-flemonlempar.cparse.*sqlite*.tar.gz
7 b8 k; {1 Y# y; Y, _# a( Q1 r& F
. d* y( t, P% V. j& j) ]' L rm-f$(PUBLISH)
' [/ J. h. a. e! a2 ?: L* J0 Y4 V
0 J9 @5 W; N% e rm-f*.da*.bb*.bbggmon.out
4 f* Y2 S4 c" l1 `0 T
2 [1 P/ P7 K% D6 S9 \ rm-rftsrc替换为:
- P' J, K( P& g6 ^2 ?
8 r6 }2 [' Q4 T: o$ } clean:
* Z: k, @% O* v6 ?! _" ^6 S( |
. ~8 }' [7 {$ m' X rm-f*.osqlitelibsqlite.asqlite.hopcodes.*sqlite.gdb
/ U! L4 R: Q1 A8 J* z7 B/ q
9 ` `, q9 {/ @- U0 F
rm-f$(PUBLISH)
$ f& l4 g, {* d( z
' t, _4 d0 O2 \5 C; m/ e' O
rm-f*.da*.bb*.bbggmon.out
1 f& n4 X2 V" X1 D+ D# f1 U: U8 x6 a0 Y9 c. ?! ^
rm-rftsrc
# k9 ?8 z& Q2 X
% Z3 }) t" t; v2 D distclean:clean
( p# {1 w' n+ I3 _0 A
& n: J2 [) E8 ~+ R: H rm-flemonlempar.cparse.*sqlite*.tar.gz
9 A% s& R# K- T$ z1 [: ], R. j: u
6 n p% {% |% x! x rm-fconfig.h
$ v" J4 k# U% R. n$ O3 |
( e7 x$ e6 Q0 v) _- T 即增加makedistclean项。热门
推荐:谈超频的概念及方法2004年十大热门
显卡超频王
% L4 V* C3 Z/ o6 D& P7 G
S4 a& T3 T/ m
123
! I/ U& L8 }8 V# x
2 d) Y( E# Q( s" u9 d# a/ Y0 E/ Q8 Y1 [8 a5 J) ^. |- n! b6 t* A$ e8 ^ D
& c: @' y$ L5 P7 | _2 O
( }& i5 u) }% D% o; f) \/ k
6 i3 M0 \* X/ {# v6 H K) u, [0 Z4 g4 ?/ e1 N: m' o
8 k$ i/ p p3 |$ n9 @9 F' \; V9 U; A2 m4 W
! D5 K9 N! p q) J5 v
% {5 t8 Q* |* Y- ^
8 w+ q1 x/ r& Q. C" b" Q7 i' ]9 L: v7 `" q0 n
二、在sqlite下增加Makefile文件
. E% i" `* A+ e* s
: J" Q, ~/ Z v1 j 在sqlite目录下应该没有Makefile文件,而只是有一个sqlite/Makefile.linux-gcc文件。我们要移植sqlite到uclinux,那么就要自己写一个合适的Makefile。
+ M5 P3 v* `( h# |" ]3 {
, N( @6 h7 v1 A: l 内容如下:
! m9 L9 C: s& z2 }" B2 [# n1 D) M
6 [+ W7 ^& f6 z7 I/ Y4 M* C, b ===========Makefile内容开始===========
$ v. O$ O4 F* r3 i
# w" n! ~6 u5 e3 X# f1 l #!/usr/make
8 ^/ m$ |* o* `
6 N, u T9 p& x) i0 ~* m3 D* y; V3 `( B #
0 i+ X! V8 ^- p8 @6 C4 g; g
# ]+ i9 i: E0 D) G! P. U #MakefileforSQLITE
3 l c( Y# Z t) x- x v ^7 w3 y
' R. G& a( E$ U7 ^/ \$ N #
9 R3 K* o/ x* d* u
. M( x0 N# F6 E8 \' I/ S5 m2 o #ThisisatemplatemakefileforSQLite.Mostpeoplepreferto
/ C& ]3 Q/ t) E: a k
( `! K; \; O- p3 q
#usetheautoconfgeneratedconfigurescripttogeneratethe
J$ L! X! ~4 G/ k, ?$ G8 v. S* B8 V
#makefileautomatically.Butthatdoesnotworkforeverybody
- q. Y+ Z; B2 T' Z- I: R$ p# j. x8 X
#andineverysituation.Ifyouarehavingproblemswiththe
2 M& K& `1 g S2 v; j
1 @2 Y6 O, t2 H' ~8 i
#configurescript,youmightwanttotrythismakefileasan
5 h0 J! v. ?% a+ |0 r$ x
9 `0 b8 P5 F$ r2 X3 m1 B" f9 ^' p6 I #alternative.Createacopyofthisfile,edittheparameters
- Y0 M# z% X; s k3 S
: i C- W; X P7 P8 \; k7 z$ z #belowand
typemake.
0 J% k6 W/ U2 y" K- d* Q6 J- I$ |; N9 u1 C. K: m4 M
#
e: h2 o! L( N( D( u$ f( y' m) q
) n9 l, w' I% B) |3 C ####Thetopleveldirectoryofthesourcetree.Thisisthedirectory
- O# h" ~7 W* J
7 t" H' k) Y: z' R( b. M/ B$ f #thatcontainsthisMakefile.inandtheconfigure.inscript.
, K/ ?( t* l, I K) X
0 }" w M7 F9 |5 K
#
* `7 X+ A* u3 U" s4 W4 r
' P# D M. V/ W* E. p, T7 [: G
TOP=.
, ]% S/ p! ~5 d& w! N$ x8 r
# J. ^3 T* {8 m k! W5 T6 _0 x' [ ####CCompilerandoptionsforuseinbuildingexecutablesthat
V+ G3 ^6 L: _
! K0 d9 F4 V! ?$ h. Z #willrunontheplatformthatisdoingthebuild.
/ l; }6 e( H4 [& d6 c4 m; Z( x
$ i) ~% M& l) y3 v7 f/ A0 g# z #
1 d2 f: o3 B$ u' a1 a. d2 O
0 w' c& z8 p3 b: l1 s BCC=gcc-g-O2
, p) L& S% m- `- B' x5 l5 P: m# g" {5 Y8 ?
#BCC=/opt/ancic/bin/c89-0
4 w5 v7 m q: o5 _2 V
8 U& F7 D2 @! [+ v ####Ifthetargetoperatingsystemsupportstheusleep()system
1 J* @7 D6 i7 ]2 J* ]2 `' O' L
1 i x; \' f% T1 G0 a
#call,thendefinetheHAVE_USLEEPmacroforallCmodules.
/ V2 z. K9 K" C, k/ C$ R
' y: g6 k$ E$ M4 X) u* {' y S+ P2 z8 M
#
' I* o& Z( r3 S; _) v
) Z$ s. |9 i" E# J* Z
#USLEEP=
/ W- W3 Y6 Y$ R
- T: f* I, W0 z* ~9 D6 d' k USLEEP=-DHAVE_USLEEP=1
, |# U# @& H5 d
$ E) S& t- k; a$ G( F" h ####IfyouwanttheSQLitelibrarytobesafeforusewithina
& }* l/ `0 o" X: o) l$ ^ P1 Z
* x! |9 o j# D8 B% V! I% n1 m' w+ a #multi-threadedprogram,thendefinethefollowingmacro
# P k( p9 E! R5 D4 L# v: U
# x: W+ K9 g/ `5 {0 W$ X& {' v #appropriately:
0 V; P# D- W w$ U( m t9 |! V5 o/ m) _0 v( J
#
6 K( W( F Z4 q; `% t i
0 M5 Y& g. ?0 d0 O
#THREADSAFE=-DTHREADSAFE=1
$ ^; ?9 j3 ]' e4 M/ b/ E; V
* u5 |" ?% j' W) ] THREADSAFE=-DTHREADSAFE=0
1 d8 s+ w$ T( g5 L
9 u# r$ P9 \# o7 ]. c ####Specifyanyextralinkeroptionsneededtomakethelibrary
6 x% M& e& Q, }* l+ h
3 x k ^/ k) B #threadsafe
( b6 M( l0 _9 K) J
/ w: d3 s$ T' }5 P* q- ]& B/ s #
" Y: _ J; ?% L8 K# x# C6 D
# A9 T$ `5 v# e5 V
#THREADLIB=-lpthread
( K+ x, q7 O" e
) Y9 h- t$ \4 j+ u* R" o THREADLIB=
& L* N. X# v* ~2 z. W
( [& F! [+ P1 m2 U$ N$ w9 |! n
####LeaveMEMORY_DEBUGundefinedformaximumspeed.UseMEMORY_DEBUG=1
4 i' x$ m6 `! N) n1 C8 D8 E, t7 Z1 P; l8 O# \+ A4 v
#tocheckformemoryleaks.UseMEMORY_DEBUG=2toprintalogofall
9 {7 x9 ?. d$ b! R7 H1 v+ g3 a9 q0 K, p/ D v/ m
#malloc()sandfree()sinordertotrackdownmemoryleaks.
( v7 U' i5 L; Y; j, }5 d, G! O) j$ P7 I: Z4 \ B* @
[color=#FFFFFF']
2 w: O1 l1 Y! }! t2 Q' D
- [/ z5 @. q$ { s6 E
#
) e6 A$ f, v, a1 I
3 r& n [. F6 _" b' _ #SQLiteusessomeexpensiveassert()statementsintheinnerloop.
2 K5 g3 ?- X5 ?& _/ t) ~
4 o% g. l& b) a
#Youcanmakethelibrarygoalmosttwiceasfastifyoucompile
! l" w9 y/ |6 @$ j0 Q& H
8 T/ p( Q, T$ P: D" X, I' M( L y- z #with-DNDEBUG=1
" ^% c8 q7 H% A0 Q2 S
3 g$ K% G t: z3 v #
0 ^9 K8 ^* V: ~# X$ b* Y7 S. f* ~
#OPTS=-DMEMORY_DEBUG=2
f2 g6 K# X1 a! ?
+ ~ f+ |4 y5 k! M #OPTS=-DMEMORY_DEBUG=1
7 R6 S$ N4 R+ n* v4 ]' C8 |
7 Z* A2 B) H) \4 h #OPTS=-DNDEBUG=1
^( m: ^7 I+ a. R6 s+ \1 @" x3 V3 Z0 r! l8 n( ^
OPTS=-DMEMORY_DEBUG=1
7 M8 I3 A! H$ l, \+ W- G \" P* F N* ]
####Thesuffixtoaddtoexecutablefiles..exefor
windows.
$ A( j8 j& z( j/ d9 X* M
$ p4 K1 z1 U& h# C; o" } #Nothingforunix.
1 @; J7 F( ~" z4 I
# W3 o9 @8 d7 r4 h# e" E9 m* | #
( |( e& d4 A1 V! t3 v! C& {+ w2 I7 n: B' j6 s$ y* P
#EXE=.exe
& m( B2 y) `* g* W
& m2 I1 S- C4 t3 x( h EXE=
/ p5 }4 J1 U$ g/ M, \" n
; F4 K3 U$ N9 y" {8 w
####CCompileandoptionsforuseinbuildingexecutablesthat
& w, j! d( b6 | @, @' g" ], @9 `% \
#willrunonthetargetplatform.Thisisusuallythesame
5 F9 k6 ]* T0 M1 Y& n% h4 C
# H7 J, E [1 p7 ~% s9 Z* J5 B2 N
#asBCC,unlessyouarecross-compiling.
3 t" o7 _4 A; ~1 ?/ C7 o- y# e9 X' k
#
# K. U+ y0 o g1 G
% r5 Q* ?+ f4 e! i4 m; J TCC=$(CROSS)gcc
1 F# x$ `2 B; [' I+ h- _, n: u/ f0 T1 l3 { V {- B
FLTFLAGS=-s12000
9 Z% X* Q3 _" ~4 R( f* l
* C8 [0 g' E' ]# ]
#TCC=gcc-g-O0-Wall
, ~0 u2 O1 O: o6 |5 u7 T" e3 l& d
9 T& o E; l, r #TCC=gcc-g-O0-Wall-fprofile-arcs-ftest-coverage
' r @: T, x3 J% x1 k6 ^
" d n+ Z# A/ J, A3 z) }5 m0 n1 Y
#TCC=/opt/mingw/bin/i386-mingw32-gcc-O6
' ^; @' H; Q7 ?4 G) l
+ K: W( @6 Y" ~# z8 u& m/ k& ^6 V #TCC=/opt/ansic/bin/c89-Oz-Wl,-a,archive
7 n- m- U2 F9 o, ]0 P" N
) ?! l& r9 M4 H4 ]" k ####Toolsusedtobuildastaticlibrary.
2 e: `: t* x9 e7 }[color=#FFFFFF']
, c& \5 e g. L* m2 t) M* R* U
: \, Y2 e1 J" ]; @9 h9 J" W* | j, j4 @
* w, R0 Q3 O$ N& M M' n9 d9 u #
; G6 _3 |8 Q E. j$ i0 W& U( h" a( S* b8 K6 Q% F6 F
AR=$(CROSS)arcr
5 s6 `# n; E' D; y8 q3 K# z i
1 B# i$ ^. J$ z #AR=/opt/mingw/bin/i386-mingw32-arcr
4 `6 E# t3 @. l" z/ `7 y9 ?
! p* h2 E6 Y9 ^) R7 d- |7 q& L RANLIB=$(CROSS)ranlib
2 d& t S( z) ]: `: y
3 [! p: L5 W- c+ _, P3 N #RANLIB=/opt/mingw/bin/i386-mingw32-ranlib
/ k q1 ?. ]3 p% c, E
" c8 u! J7 P" \" N8 J' b+ r
####Extracompileroptionsneededforprogramsthatusethe
TCLlibrary.
# g, ~; j# H/ O8 Z/ x1 n3 E- l, C* j* r
#
) J% T' W- U% Z) H4 {3 Y
3 H, \* Z4 u3 K #TCL_FLAGS=
- _- w/ }3 y8 z. {: a* `) C
; m' t6 H O9 p #TCL_FLAGS=-DSTATIC_BUILD=1
" g' N8 P% h( q$ K9 r
! Y4 c5 u$ z5 `) b$ o
#TCL_FLAGS=-I/home/drh/tcltk/8.4linux
( [4 \! {, e. p& b4 g* ~9 f5 x# C* p- {- \. r( Q8 g
#TCL_FLAGS=-I/home/drh/tcltk/8.4win-DSTATIC_BUILD=1
" M* ^) W/ { W6 u" n
. J. R9 G1 u8 E7 t+ R( ]& G
#TCL_FLAGS=-I/home/drh/tcltk/8.3hpux
6 b y' A6 O% U6 X0 j# K# x+ O# G. H. e9 f8 \0 K
####LinkeroptionsneededtolinkagainsttheTCLlibrary.
# h j0 h9 O6 C
) R, D# ?3 a8 r: u #
% q+ c @2 g; f+ ?6 Z/ o0 L: t, b# t8 h6 u. D2 s7 M
#LIBTCL=-ltcl-lm-ldl
! F1 b9 S, {5 H$ E* ^: }
+ }9 R1 J) e8 x! H6 K, M #LIBTCL=/home/drh/tcltk/8.4linux/libtcl8.4g.a-lm-ldl
, W8 y' Y: ^6 c4 x, M, U! H) o
$ c! ` S6 g" G- \ #LIBTCL=/home/drh/tcltk/8.4win/libtcl84s.a-lmsvcrt
+ a: [6 X ~$ U4 A/ ]) R2 ~
% w1 @0 h8 M$ L- g& T6 a* d
#LIBTCL=/home/drh/tcltk/8.3hpux/libtcl8.3.a-ldld-lm-lc
; O2 v3 E2 K( m4 ^8 n N
8 f' E0 Q# X& w
####Compileroptionsneededforprogramsthatusethereadline()library.
6 h) H% A) r- b S7 N
p4 I! o7 m _1 v1 N' g- y #
- |8 p( d, g! }: `0 U; N0 }4 t# Z6 T2 H' ]6 a, l1 y
READLINE_FLAGS=
; H' v8 J- Z- I/ \$ h
% k" @9 ~! U) [. Q; b #READLINE_FLAGS=-DHAVE_READLINE=1-I/usr/include/readline
" k8 A2 w; l: }( G4 ~. _# o[color=#FFFFFF']
+ o2 C# I, r( z% ]8 D4 j8 }
8 L; b" _* k) w1 Z8 [' _2 _! \% f" [' _' V- G3 q' Q6 ]
####Linkeroptionsneededbyprogramsusingreadline()mustlinkagainst.
! c3 Z# n: A4 Q( X* o1 ~: n
4 |/ F; E; {+ Q |( V. V2 |, m1 z #
g1 F" z4 J d$ [/ y4 U- q" q6 s
#LIBREADLINE=
2 ~; j" b" E% R$ g p7 O7 ~8 w4 a# e0 v6 s1 i! g
#LIBREADLINE=-static-lreadline-ltermcap
2 O, G/ w l& h2 M5 t; B1 A" G% u @# w6 E* S! L* o0 O
####ShouldthedatabaseengineassumetextiscodedasUTF-8oriso8859?
) l) [' I' ^( X, _4 [$ `; X
) W6 D+ R4 N) Q #
" y" B+ w, ]7 c9 Q* p" |! O' Q, m: c* x8 J% d1 e( W5 O1 C
#ENCODING=UTF8
4 J! i) |& [( o9 h9 @
1 q, D ?7 o. K) r% b H- }! L$ c ENCODING=ISO8859
1 l: u7 r) b+ d9 y7 y. k
K% x. X' X: T! R0 B8 B9 n #Youshouldnothavetochangeanythingbelowthisline
9 r+ u D2 b5 h0 x' Y$ A- s0 o" x" B
. C' I, C G: Q ###############################################################################
, u5 l @: q& l# @/ o
+ h& u8 P/ j. P( P: J3 p include$(TOP)/main.mk
9 V |# Z( V8 w; Z* M3 g8 G/ v' x
===========Makefile内容结束===========
9 e. V: o7 u$ ^7 M6 F) Q$ q! ^ x
. r3 r: d0 I8 R! s7 ^7 H
注:
5 K) H4 v# c! b1 m
% Z: v3 M, q! o6 Y/ A
1、在uclinux下的sqlite的Makefile将不去用到TCL相关的库。
- m" Y$ I/ B0 \0 n' D; v
% ^! B7 x( \, l; d0 Q- N2 p. _ 2、在uclinux下的sqlite的Makefile将不去用到readline()。
1 Z1 o; }9 b! s; b, G2 S' ]# ?
& D* y+ q+ g! m 在sqlite/README中有关于Makefile的一段描述:
1 u7 u# I7 y3 l; l! f3 r1 Z/ G) u( y3 ]+ |( s
Theconfigurescriptusesautoconf2.50andlibtool.Iftheconfigurescriptdoesnotworkoutforyou,thereisagenericmakefilenamedMakefile.linux-gccinthetopdirectoryofthesourcetreethatyoucancopyandedittosuiteyourneeds.Commentsonthegenericmakefileshowwhatchangesareneeded.
+ Q+ i+ o4 P$ Q7 d! Q- Q# l) T/ B' F# d
你可以用sqlite/Makefile.linux-gcc作为蓝本来修改适合你自己的Makefile。
+ {% |. r D4 A: e4 @
0 z. b8 @' E* _5 A$ z/ \ 你如果有兴趣的话,可以把上面的Makefile的内容和sqlite/Makefile.linux-gcc内容diff对比一下,看看uclinux下的sqlite编译有哪些不同的地方。
# g2 g/ n& f0 b" i
) |. O5 Q3 U& Y& r
三、修改sqlite/src/os.c) ~* w/ G5 |, u2 d/ [! ^, v/ x
) n/ j+ F T; `
如果你的sqlite包中包括os.c文件那么就对其进行修改,没有os.c文件可能是你的sqlite版本比较新,那么无须修改。
' W- y0 n( e& n
# D% P- p$ [) K& H 将所有你找到的:
% e0 s: w9 P( A3 j0 i
* X- C* \. H' c0 t, G3 f 用:
8 @' I3 n, x' A, d) B! J" z& G U6 e" C0 y x: X- x
替换。热门推荐:谈超频的概念及方法2004年十大热门显卡超频王
; {" L9 S8 R, q/ k+ M
+ J D, h$ Y9 x( b5 w1 e" T' z
123
" q( s+ _4 C3 l0 H2 X& F5 ] d. I6 s* r3 j6 G+ m+ I; W5 ?
+ K2 k( o! u# C+ F1 \4 `6 X7 P9 P5 _, G% Q$ `
- l2 n+ t% w j9 J2 `0 h
7 _3 g/ y3 i0 ?( B* `5 G/ [
. F" D7 O/ Q$ m$ o' t% e2 q1 F
R, [- P4 b. q6 Y; B8 O4 t
# H5 P; G5 E* E( l" ]
8 Z# n6 E2 O0 d8 L( ]
2 x) C+ A* |" n& c' ]
7 P& D! I! [4 q: }
, R9 x P! N. k& p* W) }- G) n0 k$ t) u) Q
: a/ {, d; n) T5 L U
四、修改sqlite/src/shell.c
& ]+ e; x+ a$ ] }) z; ]" a" B2 Q9 Z0 P; C# h1 V
1、structprevious_mode_data
结构定义项:
; ^* ], O7 U' L( K4 l7 ~+ i
2 f( S: q. N) f( s9 F" {6 N7 a 将intcolWidth100;
0 [; ^+ y, ~: h* I8 @& o
* A$ w( E& b) l! i1 R) J1 \ 用intcolWidth20;
0 P+ d+ j Y$ C U9 {- h" w8 J
5 P$ N: G0 G. l2 r3 W+ ? 替换。
: J4 t' w; i7 O9 J
9 v; h; X F6 g% H. A 2、structcallback_data结构定义项
( R3 a0 Y, d4 ^( j
[color=#FFFFFF']
/ D' A" o& ~4 K, K
# @9 r5 M0 @ d: W* _2 ~
' l7 b5 v) r& @ 将:
# r, X( J4 N3 o' V/ F* d6 E" S
y: z8 r* ? l4 a3 o5 {7 n intcolWidth100;
$ ~1 r5 W+ K9 q& h
1 d. Z2 G+ S# @% A' o7 Y2 V intactualWidth100;
. {+ ^, E0 j& X" w" j2 S3 T; I
& q& U9 N- Z) j
charoutfileFILENAME_MAX;
" ]3 Z5 _* X) O7 a) m- b/ m% u: B2 I* w+ |- S
用:
5 B1 e7 I9 J3 @! q0 P/ ` D6 ?
( ^: f% ]) L( A7 n intcolWidth20;
4 I% F8 D# \; U2 P% l
( i4 j9 D2 _$ `5 M D intactualWidth20;
- a# F* {+ t/ k5 x
/ ^0 Q# h+ Z/ J: o) e' r3 }2 o char*outfilep;
1 a; J2 Y' h d# o! X$ A# l6 N1 o5 P+ q
对应替换。
$ K8 ?! Z2 Z1 U ~
% f9 B6 N% m2 L( r" h) V* P
再在结构下面增加:
3 L4 o4 S5 m3 I2 Y0 p
! \) ^ N4 R" y4 w$ ]! _ U
#ifndefFILENAME_MAX
! `9 p% q" w6 W: L2 J) H
P' a( U! z5 D5 A #defineFILENAME_MAX4095
& [0 Y0 {4 J0 w( F
8 f8 ]1 b% v4 _; A' q8 a4 r #endif
% t+ B) E ?! h5 m6 E' B
8 I& M, Z5 n# _1 l& ^; C+ w- K
charoutfilenameFILENAME_MAX;/*Filenamefor*out*/
4 R; X T5 d8 s/ G8 K
; b6 ~; w* W( v$ w3 q7 |1 o 即
9 o& d" ?0 U5 F3 C) w" F# b) Q0 T7 q8 `
structcallback_data
2 E5 s0 z- z8 ]: j" T% |$ w& s: W N
...
6 i3 z" n. Q! F: X& |1 p0 `, u3 K) R8 e, Z" l. G
;
V* E9 f3 W6 Y! O' G( G
5 }: Z0 y0 A2 G( P/ t
#ifndefFILENAME_MAX
8 r% b# i7 Y3 S, v a8 o
% O. ? \- @4 X( g0 H8 |( L #defineFILENAME_MAX4095
8 s3 n7 w x+ m: F: \ N+ {; d" A7 M
- N0 \7 d. Z% [+ v5 \ #endif
6 U) n! i# [# n: C- [% W6 O
4 ^. f0 X( K6 R& }/ ] charoutfilenameFILENAME_MAX;/*Filenamefor*out*/
2 M: N4 Q2 q5 a- S! e
6 N; C" Q, x$ {6 G0 H( s 3、函数do_meta_command(...)
( ^+ I1 B9 {) m$ L
, U. v" B! |. S* S7 W J. q0 l 找到类似这样的一句:
+ h; j# [9 J+ o, l+ c' ?/ ^/ i9 j8 H
sqlite_exec(p-%26gt;db,PRAGMAdatabase_list;,callback,%26;amp;data,%26;amp;zErrMsg);
* c% a" k% d# w# [, Q
) M+ S2 T9 o1 E" a% n7 c0 G
在它的前面有一句
# H8 @* S5 b3 c) v+ i- y9 E1 s4 d2 B: _" o3 w
memcpy(%26;amp;data,p,sizeof(data));
$ q C" N) R) [1 B) F
& Y' H- B4 A, @2 B2 G/ p& E+ j
现在在memcpy下面增加一行
% Z! j& [: i+ N" n' C9 i
5 t* a+ |1 ?3 N2 ?
data.cnt=0;
6 q7 U: x' y( H6 w0 v! W( c# G/ @3 @9 d7 }8 D$ S
即将结构中cnt的值赋为0;
8 F- i. N: b4 F) h; S; s$ J/ D
3 ~. m) f1 {3 b% R- ? A4 s9 C 现在代码会被修改成类似:
6 H7 w7 y7 C. ?: [8 t
7 x: h- L4 B# `7 v- J8 W
open_db(p);
+ d5 N6 q4 l) q
[color=#FFFFFF']
& [2 @6 @9 o/ I* G$ n
! e- h ^" L+ t7 Z6 _% M0 h0 k' |5 _" o) n
memcpy(%26;amp;data,p,sizeof(data));
# k9 K; u4 W/ Y$ S
7 F( V; s9 n% q" N data.cnt=0;
2 `$ [1 k& {% b, o. A( |; f
8 e* Z: S, S4 ?( K$ T3 w% U7 h
再继续。
5 f4 r* F. t" E
3 x7 y# D/ K% K7 u
找到类似这样的一句:
. e. Q% V* t1 n9 v# P1 d+ p1 G$ K; |! B8 X( z/ K8 D
strcmp(azArg1,stdout)==0
" r* I T9 L; I) @; ^. K4 S, B k8 A, q2 I% }
在它的下面的括号中:
2 q( j1 Y) x2 _+ X. K
( W& o) L7 l& J, u. S1 A* K! W 将strcpy(p-%26gt;outfile,stdout);
$ ]7 `3 Y5 }. k3 _+ W8 @, ^% @- y4 G! S1 g
用p-%26gt;outfilep=stdout;
2 C3 i2 H+ A" l/ a7 e9 T
2 O: ^0 |; l9 w7 D
来替换。
& B* x2 ?; G4 ^
* d% S8 _! `1 g0 H- n' b$ [ 再在它下面的5-6行处
. Q, F' z- L. M; I
& v/ ?! E9 B9 `2 l 将:
G$ h7 r" M# a0 ?- k% l. }- [* B5 J7 K. S+ b8 G
strcpy(p-%26gt;outfile,azArg1);
- Q6 s% x |8 z6 W- ^
; w+ a& e+ y. q' W' x% X! u' H1 i 用:
# |7 g/ q" h: Z t
; n% S5 g7 Y6 g r
strcpy(outfilename,azArg1);
* Z# Z- t3 F6 z0 o/ w5 ^$ e
( }* J9 }/ K6 x. Z p-%26gt;outfilep=outfilename;
* {; M% H) C! {( C, s& Q$ _: @; x/ u" d q+ I
替换。
8 |$ r* J6 _$ v! H, I# }! u
8 D$ a+ U' d. x9 h 再继续,找到类似这样的一句:
; h4 v! m* A6 y; k) I! C
; l4 k2 X; e- |: y* b8 |! S fprintf(p-%26gt;out,%9.9s:%s\\\\\\\\n,output,
5 i2 D" H; p, P) G2 Q, _1 }' \+ a' l; K7 }. ^0 o1 _
将:
6 F( V$ y# b* `7 r, Q6 g+ J
; |+ K6 A: p! O' ]& K+ s6 f3 X# m- k fprintf(p-%26gt;out,%9.9s:%s\\\\\\\\n,output,strlen(p-%26gt;outfile)?p-%26gt;outfile:stdout);
7 y7 E2 t8 E# ?; x+ j Q
* f& t: \9 d$ p+ M& t/ l% D# {' U3 y
用:
0 d. H! G3 Y6 J m# H; m+ ?% s
/ h4 X3 k o0 g# o8 M; o$ k fprintf(p-%26gt;out,%9.9s:%s\\\\\\\\n,output,p-%26gt;outfilep%26;amp;%26;amp;strlen(p-%26gt;outfilep)?p-%26gt;outfilep:stdout);
N1 u) d' e: Y K
/ P; N0 q5 l2 k9 [( X( j! x 替换。
+ h! g3 m: o. T. }( _
9 j" V! \* n9 t) I; M! d 完成修改。
% T' {+ S( H% }3 Z- Y! o7 K
) _& B d: T& E 上面的所有的对sqlite的修改完成后,你就可以makedep;makelib_only;makeuser_only;makeromfs;makeimage了。
, A& p3 R8 z7 I: I; C
# k0 `! Y. G; Y3 Y
如果你对sqlite的修改,在makeuser_only过程中出现错误的话,你可以忽略makedep;makelib_only命令,直接再次进行makeuser_only;makeromfs;makeimage;就可以了,而不用重复makedep;makelib_only。
+ a- y3 O3 \8 ]2 `3 d
+ ~5 ]: O# ^/ I3 H4 y* v
makeimage会帮你生成romfs文件
系统。现在在uClinux-dist/images下面就有编译生成的romfs文件系统了。这个就是我们需要的包含有sqlite的romfs了。
6 H# D4 V1 \. S
3 \5 p; S! r' Q7 c 在上面的过程中,你可以不用在“makeimage”后再去“make”生成kernel内核,因为你只需要生成romfs就可以了,它里面已经有sqlite了。
) L" G8 O1 v" e& M5 x- F& n- N
, I. {& J7 z: L 现在你就可以把你生成的含有sqlite应用程序的romfs下载到开发板上运行一下。
- _/ W V N+ }# a& ]
* w; |) W. ~) l7 q) L( p Welcometo
; L; n7 V! T' _1 J
9 S% Q# f/ o3 d: U ______
5 T, v3 u, S. }' e- L* v! n9 W
* y! _- `& C2 ]8 z. o+ Y+ s7 p2 t /___
" W# P: \- B: k1 {6 E$ [8 S4 A8 f. @+ D
___________
6 L3 x! h2 G; B' W
: O E& B1 g3 o! q, q$ [+ B _\\\\\\\\ \\\\\\\\\\\\\\\\//
; @+ I i8 n1 F3 p; R; v; e% e* n
. q, a; E3 r* i _ ___ /\\\\\\\\
1 A; x4 f9 E6 Q+ B9 O4 O* U
0 m& ~% _1 H1 }9 e
___\\\\\\\\____ __ _ _ \\\\\\\\____ \\\\\\\\_/\\\\\\\\_/
8 J$ N1 R7 Q) B% F/ q' `
3 S& e4 d Y2 G& \
_
3 v* p9 k |. i0 y
" A1 t% ~1 Q, R. v& v GDB/ARMulatorsupportby
9 l0 y4 U& o4 z& {
: {* ~0 @5 z& v" ^5 d Forfurtherinformationcheck:
4 F9 _1 A. L% b7 A" O; U# V
, c5 f6 C% N# V9 N8 B' ~ http://www.uclinux.org/
; p$ y, X9 I3 M6 V; U
* t7 v& z; _8 a Command:/bin/ifconfigeth0up10.0.0.2
; o5 Y0 {4 O1 }, P5 k" y. _+ G1 D; h, u- `7 C1 D( O' N# F3 [
ExecutionFinished,Exiting
' B9 ?, t0 x. I2 u- z6 } ~- I$ }: v( `( }" r: D4 P
init:Bootingtosingleusermode
- D& V) k9 `. Y* j- u( V: N" c7 G# ^4 c- J. e1 y- j6 [$ j2 P
Sashcommandshell(version1.1.1)
* |! q! f- q8 s B% [: [7 m6 l0 k- X0 y, f! Z e% m
/%26gt;cdbin
- \6 x5 j! s) _: ?+ D$ j
_( u) k; g. X5 A$ e+ A
/bin%26gt;ls-lsqlite
8 E5 D( X0 ?9 w0 R
7 `8 H) ~7 Q6 L, F, d1 e
-rwxr-xr-x100327072Jan0100:00sqlite
& c& P% W; J0 D1 V! g
6 P' m4 @0 A- u/ \[color=#FFFFFF']
# d4 e, K8 o& f& |( ?1 K
. b; q1 Y( _, ?/ Q& O: k; p /bin%26gt;cd/tmp
9 `1 M4 M' R5 y6 P( |2 _
/ T. W5 u- s6 e; R( e3 F /tmp%26gt;sqlitetest.sqlite
* f( X8 \: s# G. e% g& T4 v9 `" G r, O
sqlite%26gt;createtablemy(namevarchar(80),numsmallint);
0 K0 I' V1 Q$ k
) M i [; z" h$ ]; i! [; ^* { sqlite%26gt;insertintomyvalues(yutao,100);
& a2 l: `6 j8 I4 H
9 |& g; Q9 y: I0 T' g sqlite%26gt;insertintomyvalues(uclinux,99);
2 i% G- a r' J6 D# U4 a- I
N. o9 K7 n1 L! c. Q sqlite%26gt;select*frommy;
6 \ E! E) K2 D0 x2 y2 r
2 Z1 x0 B' e4 ~$ G3 T. t
yutao 100
7 b" _$ w( }3 l9 |# u
- u+ G' N/ e; d3 \; B; {
uclinux 99
' G8 R' V0 X4 t3 Z L! }
$ b h3 [6 K2 I sqlite%26gt;.tables
, H/ o* w2 E8 r, J" l) M1 d
) w$ H* l+ _; M; \- g `
my
$ G* U' |0 `- Q ~* Q
4 c4 c- z5 N: j3 n4 U- c sqlite%26gt;.schema
% q" x: h0 M, v5 @# q* L' s4 X! \! y% h5 ^: q
createtablemy(namevarchar(80),numsmallint);
" H$ ~0 z) p! w" x# h9 _- h2 `6 l
: p) x! X# p6 b; k z sqlite%26gt;.q
& M1 U$ ~. f" H( v4 w6 i7 }+ ]5 X
" Q' a; [# m+ M- i W /tmp%26gt;lsCltest.sqlite
" }. {3 b; Q- { R
8 j5 B. o5 z9 Y+ V1 w$ F 你要保证你的/tmp是可写的目录。
- ~: R- \. P7 `
5 r7 n& F! x4 i7 \, O
好,现在你的sqlite就已经在uclinux运行起来了,感觉如何呀,在uclinux也可以玩玩“select*from”,感觉很爽吧。
/ b* C6 g* o& }/ L7 M& q
8 f& t* T5 H- v
[color=#FFFFFF']