================================================================================
= version  =  day           =           comment          
= ver 1.0  = 2008-03-11    = 
= 작성     =  문경원        =
================================================================================

 

1. 주제 :  SQLite 를 어떻게 ez-2410 에 포팅을 할까?

2. 목적 :  포팅한번 해보자.ㅋㅋ
         
3. 상세 :
      - 1차 목표  : SQLite 소스 구하기 
      - 2차 목표  : arm에 맞게 cross compile 하기 
      - 3차 목표  : i386 환경에서 만든 SQLite db 를 arm용 보드에서도 사용 가능한가      (가능하다. ㅋㅋ)
 
 
  
  3.1 SQLite 소스 구하기  
  
   소스 :
   문서 :
     - http://www.sqlite.org/cvstrac/wiki?p=HowToCompile
     - 내부 문서 /sqlite-3.5.6/readme 무서 참조
     3.2 arm에 맞게 cross compile 하기  
  
  > Readme 문서
      tar xzf sqlite.tar.gz    ;#  Unpack the source tree into "sqlite"
      mkdir sqlite-arm         ;#  Build will occur in a sibling directory
      cd sqlite-arm            ;#  Change to the build directory            
      ../configure --host=arm-linux config_BUILD_CC=gcc config_TARGET_CC=arm-linux-gcc --disable-tcl config_TARGET_READLINE_INC=" "
                    ;#  Run the configure script  
      make                     ;#  Run the makefile.
      make install             ;#  (Optional) Install the build products
  
      
       - configure 를 바로 실행하지 않고, 아래처럼 옵션을 주어 실행 한다.
      
         ./configure --host=arm-linux config_BUILD_CC=gcc config_TARGET_CC=arm-linux-gcc --disable-tcl config_TARGET_READLINE_INC=" "
           
  

 

  (imesu 생각) make하기 전에 뭘 바꾸어야하나?? ,혹시 주석처리해야 될부분이 있지 않을까해서, 여러 참고자료를 찾아보고 했지만......^^;

결론은 하나. configure할때 위의 옵셥대로 하고 make -> make install 하면 아무 문제 없이 컴파일이 된다.  후덜덜~~

 

위의 절차대로 따라하면, host에서 arm용 cross compile 환경이 완성~~짜잔~~!!

 

 

  > 실행 순서      
   [root@backup DB]#tar xzf sqlite.tar.gz
   [root@backup DB]#mv sqlite-3.3.6 sqlite   
   [root@backup DB]# mkdir sqlite-arm
   [root@backup DB]# ls
   sqlite-arm  sqlite
   [root@backup DB]# cd sqlite-arm   
   [root@backup sqlite-arm]../configure --host=arm-linux config_BUILD_CC=gcc config_TARGET_CC=arm-linux-gcc --disable-tcl config_TARGET_READLINE_INC=" "
   [root@backup sqlite-arm]make
   [root@backup sqlite-arm]make install
 

 

 


4. Target 보드에서 실행하기

 4.1. test 파일 만들기 

     > www.joinc.co.kr의  4.6절 예제 프로그램을 copy &paste!! 
         sqlite 검색해보면 나와요!! ^^
 
#include <stdio.h>
#include "sqlite3.h"

typedef struct sqlite sqlite;

static int callback(void *NU, int argc, char **argv, char **col_name)
{
 int i;
 for(i=0; i<argc ; i++)
 {
  printf("%s=%s\n",col_name[i], argv[i] ? argv[i]:"NULL");
 }
 printf("\n");
 return 0;
}

int main(int argc, char **argv)
{
 sqlite *db;
 char *err_msg = 0;
 int rc;
 char *sql ;     // SQL to be evaluted

 if(argc =!3)
 {
  fprintf(stderr,"Usage: ./testsql[dbname][query]\n");
  exit(0);
 }

 rc = sqlite3_open(argv[1],&db);

 if (rc == 1)
 {
  fprintf(stderr, "Can't open database ; %s\n", err_msg);
  exit(0);
 }

 // SQL statement 를 C code 없이 동작 시킨다.
 sql = argv[2];
 rc = sqlite3_exec(db, sql, callback, 0, &err_msg);
 
 if (rc != SQLITE_OK)
 {
  fprintf(stderr, "SQL error : %d\n", err_msg);
 }
 sqlite3_close(db);
 return 0;
}




    > 컴파일 방법  (HOST에서 작업) 
      [root@backup 01_test]# arm-linux-gcc -o test testsql.c -L/usr/local/lib -lsqlite3
       에러발생 .....sqlite3.h 를 참조할수 없습니다...

     음... 그럼 우선 컴파일 되게 하려고...sqlite3.h 를 복사
     [root@backup sqlite-arm] cp sqlite3.h  ../01_test/



     [root@backup 01_test]# arm-linux-gcc -o test testsql.c -L/usr/local/lib -lsqlite3
     testsql.c: In function `main':
     testsql.c:30: warning: passing arg 2 of `sqlite3_open' from incompatible pointer type
     testsql.c:40: warning: passing arg 1 of `sqlite3_exec' from incompatible pointer type
     testsql.c:46: warning: passing arg 1 of `sqlite3_close' from incompatible pointer type

       OK!!!.. warning 나오지만 컴파일은 됐다...다음으로 고고~~


     
       
     > 실행 파일을 Target(ez-2410) 로 옮긴다. (HOST에서 작업) 
       [root@backup 01_test]# cp test /nfs/ez-2410/imesu/
      
      
     > Target에서 실행해보자!!!  (Target 에서 작업)
       [root@iDTECK imesu]$ ./test
    ./test: error while loading shared libraries: libsqlite3.so.0: cannot open shared object file: No such file or directory
    
       에러 발생!!!!
      
   > HOST에서 libsqlite3.so.0위치 검색 (HOST에서 작업)
    [root@backup 01_test]# whereis libsqlite3.so.0
    libsqlite3.so: /usr/lib/libsqlite3.so.0 /usr/lib/libsqlite3.so /usr/local/lib/libsqlite3.so.0 /usr/local/lib/libsqlite3.so
   
    검색 결과를 찾았다. /usr/lib 에 있는 libsqlite3.so.0를 타겟 보드에 옮기자.
   
    cp /usr/lib/libsqlite3.so.0  /nfs/ez-2410/imesu
   
   > 타켓보드에서 libsqlite3.so.0 을 /lib에 복사하자!! (Target 에서 작업)

   [root@imesu ~]$ cd /
   [root@imesu /]$ ls
   app         dev         home        lost+found  proc        sbin        tmp         var
   bin         etc         lib         mnt         root        sys         usr
   [root@imesu /]$ cd lib/
   [root@iDTECK lib]$ ls
   Mcrt1.o                   libcom_err.so.2           libm-2.3.3.so             libnss_hesiod.so.2        libstdc++.so
   Scrt1.o                   libcom_err.so.2.1         libm.so                   libnss_nis-2.3.3.so       libstdc++.so.6
   crt1.o                    libcrypt-2.3.3.so         libm.so.6                 libnss_nis.so             libstdc++.so.6.0.3
   crti.o                    libcrypt.so               libmemusage.so            libnss_nis.so.2           libtermcap.so.2
   crtn.o                    libcrypt.so.1             libmenu.so                libnss_nisplus-2.3.3.so   libtermcap.so.2.0.8
   e2initrd_helper           libdb.so                  libmenu.so.5              libnss_nisplus.so         libthread_db-1.0.so
   gcrt1.o                   libdb.so.1                libmenu.so.5.4            libnss_nisplus.so.2       libthread_db.so
   ld-2.3.3.so               libdb.so.1.85.4           libncurses.so             libpanel.so               libthread_db.so.1
   ld-linux.so.2             libdl-2.3.3.so            libncurses.so.5           libpanel.so.5             libusb.so
   ldscripts                 libdl.so                  libncurses.so.5.4         libpanel.so.5.4           libusb.so.0
   libBrokenLocale-2.3.3.so  libdl.so.2                libnsl-2.3.3.so           libpcprofile.so           libusb.so.0.0.0
   libBrokenLocale.so        libe2p.so                 libnsl.so                 libproc-3.2.5.so          libutil-2.3.3.so
   libBrokenLocale.so.1      libe2p.so.2               libnsl.so.1               libpthread-0.10.so        libutil.so
   libSegFault.so            libe2p.so.2.3             libnss_compat-2.3.3.so    libpthread.so             libutil.so.1
   libanl-2.3.3.so           libext2fs.so              libnss_compat.so          libpthread.so.0           libuuid.so
   libanl.so                 libext2fs.so.2            libnss_compat.so.2        libresolv-2.3.3.so        libuuid.so.1
   libanl.so.1               libext2fs.so.2.4          libnss_dns-2.3.3.so       libresolv.so              libuuid.so.1.2
   libblkid.so               libform.so                libnss_dns.so             libresolv.so.2            libz.so
   libblkid.so.1             libform.so.5              libnss_dns.so.2           librt-2.3.3.so            libz.so.1
   libblkid.so.1.0           libform.so.5.4            libnss_files-2.3.3.so     librt.so                  libz.so.1.2.2
   libc-2.3.3.so             libgcc_s.so               libnss_files.so           librt.so.1                modules
   libc.so                   libgcc_s.so.1             libnss_files.so.2         libss.so
   libc.so.6                 libiw.so                  libnss_hesiod-2.3.3.so    libss.so.2
   libcom_err.so             libiw.so.28               libnss_hesiod.so          libss.so.2.0
   [root@iDTECK lib]$ cp /mnt/nfs/imdc/imesu/libsqlite3.so.0 ./
   

    > 타겟보드에서 다시 실행해보자!!!
  [root@iDTECK imesu]$ ./test test.db

 

# ./testsql test.db "select * from test"
 name = yundream
 age = 19
 
 name = hello
 age = 22
 # ./testsql test.db "insert into test values(\"kknd\", 56);"
 # ./testsql test.db "select * from test"
 name = yundream
 age = 19
 
 name = hello
 age = 22
 
 name = kknd
 age = 56

  에러 발생 안됨^^;  굿~~~



5. 마치며~
 arm 용으로 cross 할때는 무언가 굉장한 작업이 필요할줄 알고 지레짐작 겁먹었는뎅. 
결국 sqlite 사이트(http://www.sqlite.org/l)에서 하라는데로 하면 되네요.ㅋㅋ

그런데 타켓보드(ez-2410) sqlite 가 정상 동작하는지 확인하려고,www.joinc.co.kr 에서 
test 소스 하나 구해서 동작해 보았습니다. 

앞으로의 작업은 필요한 lib부분 radisk에 넣고 test 해 봐야 겠네요.