2012년 10월 28일 일요일

Make의 확장판 Autotoolset


make는 여러파일로 분할된 프로그램을 빌드할 때 사용된다.
리눅스 및 유닉스에서 다양하게 그리고 오래된 툴로 왠만한 사용자는 한번씩 들어보았을 거라 생각된다.

여기서 소개할 것은 Autotoolset이다.
파일이 많아지면 Makefile이 복잡해 지고 이식성을 높이기 위해 Makefile의 업그레이드판인 Autotoolset을 사용한다고 한다.


환경은 우분투 12.04 , Mint linux에서 실행했다.

1. Autotoolset을 설치하기 위해 sudo apt-get install automake 명령으로 설치한다.



2. 단순한 c파일을 만든다.(Hello world를 출력하는 c파일이라 한다.)



3. autoscan 을 입력한다. 그러면 configure.scan파일이 생성된다. 이 파일은 반자동으로 메이크파일과 플랫폼에 따른 매크로를 생성한다. configure.scan파일을 수정한다.


--configure.scan--
  #                                               -*- Autoconf -*-
  # Process this file with autoconf to produce a configure script.

  AC_PREREQ([2.68])
  AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS])  
  AC_INIT(hello, 0.1 , kim@gmail.com)
  AC_CONFIG_SRCDIR([hello.c])
  AC_CONFIG_HEADERS([config.h])

  # Checks for programs.
  AC_PROG_CC

  # Checks for libraries.

  # Checks for header files.

  # Checks for typedefs, structures, and compiler characteristics.

  # Checks for library functions.

  AC_OUTPUT(Makefile)



--configure.scan--


이 후 configure.scan파일을 configure.in 로 파일명을 바꾸어 준다.



4. Makefile.am파일을 만든다.
 
   --Makefile.am--
   bin_PROGRAMS  = hello
   hello_SOURCES = hello.c



5. 프로그램에 대한 정보를 기술하는 문서를 든다.
  touch AUTHORS ChangeLog NEWS README
  이 파일이 없으면 에러를 뿜어내니.. 만들도록 하자(자동으로 만들어주지 않는다.)



6. aclocal, autoconf, automake 을 입력한다.




7. 이 후 configure파일이 생성되었을 텐데 이 파일을 실행시키자.
  ./configure




8. 그러면 Makefile이 나올 것이다. 이 파일을 열면 프로그램의 빌드에 필요한 많은 정보를 내포하고 있다.



9. make를 실행하면 hello파일이 생긴것을 확인 할 수 있다. hello파일을 실행시켜 보면 우리가 원하는 결과를 얻을 수 있다.





 

2012년 10월 18일 목요일

안드로이드 커널에서 System call 추가하기

커널쪽에서 시스템콜을 추가하고

커널에서 돌아가는 어플리케이션을 만드는 순으로 작성하였다.



---------------------------------------------
~/work : 워킹디렉토리
~/work/kernel/arch/arm/include/asm/unistd.h : 여기에 System Call 번호를 할당하여야 한다.

unistd.h



~/work/kernel/arch/arm/kernel/calls.S : 처리 함수를 등록하여야 한다.
calls.S

System Call이 발생했을 때 수행될 함수를 구현하자
printStar.c(~/work/kernel/kernel/printStar.c)




별찍기 소스는 아무렇게 넣자..


Makefile을 수정하자
Makefile(~/work/kernel/kernel/Makefile)
obj-y 에 목적파일을 추가한다.



이 후 ~/work/kernel 디렉토리의 fast_build를 실행시킨다.



어플리케이션을 만들기 위해 ~/work/android_work/external/ 디렉토리로 이동하여
mkdir printStar로 printStar디렉토리를 만든다.
printStar디렉토리에서 printStar.c를 생성하여 아래와 같이 코드를 작성한다.
printStar.c(~/work/android_work/external/printStar/printStar.c)




이렇게 작성하고 printStar디렉토리에서 Android.mk파일을 생성하여 아래와 같이 작성한다.
============================Android.mk============================
LOCAL_PATH:=$(call my-dir)

include $(CLEAR_VARS)

LOCAL_C_INCLUDES:=\
     $(LOCAL_PATH)/include \
     $(LOCAL_PATH)/android

LOCAL_SRC_FILES:=\
     printStar.c

LOCAL_MODULE:=printStar

include $(BUILD_EXECUTABLE)
============================Android.mk============================

작성 후 ~/work/android_work디렉토리에서
. build/envsetup.sh
chooseproduct sec_smdkv210
mmm external/printStar/

위와 같이 입력하면 출력 결과물은
out/target/product/smdkv210/system/bin/printStar  에 존재하게 된다.
이것을 ~/work/android_work/rootfs/system/bin 에 복사한다.

rootfs 디렉토리 내에서 다음과 같이 tar로 묶어 sdboot로 전송한다.
tar zcvf ../../sdboot/maple210_android210.tgz .


kernel 이미지와 안드로이드 이미지를 sd카드에 쓴다.
sudo ./sdwriter_maple210 sdb
마지막 sdb는 유동적으로 변할 수 있다.(dmesg | tail -3를 통하여 알 수 있다.)


minicom 결과




우분투에서 두 파일이 같은지 아닌지 확인해 보는방법

1. 사이즈를 비교한다.
  -> 사이즈가 똑같다면..?

2. jacksum을 이용하여 md5 나 다른 해쉬를 이용한 값으로 비교한다.
 -> jacksum -a md5 파일이름

두개의 파일의 결과를 확인하고 비교한다. 한글자라도 다르면 두 개의 파일은 다른 파일이다.


출처

nfs-common 의존성


ub@ubuntu:~/work$ sudo apt-get install nfs-kernel-server nfs-common portmap
패키지 목록을 읽는 중입니다... 완료
의존성 트리를 만드는 중입니다    
상태 정보를 읽는 중입니다... 완료
몇몇 패키지를 설치할 수 없습니다. 요청한 상황이 불가능할 수도 있고,
불안정 배포판을 사용해서 일부 필요한 패키지를 아직 만들지 않았거나,
아직 Incoming에서 나오지 않은 경우일 수도 있습니다.
이 상황을 해결하는데 다음 정보가 도움이 될 수도 있습니다:

다음 패키지의 의존성이 맞지 않습니다:
 nfs-common : 의존: rpcbind (>= 0.2.0-6ubuntu1) 하지만 %s 패키지를 설치하지 않을 것입니다
E: 문제를 바로잡을 수 없습니다. 망가진 고정 패키지가 있습니다.


ub@ubuntu:~/work$ sudo apt-get install nfs-kernel-server nfs-common
설치하면 됨..


portmap을 rpcbind가 대신하고 있으니까 portmap이 없어도 된다는 이야기...

여러 파일 압축해제(tar)

많은 파일을 압축해제 하고 잠시 자리를 비우고 싶을때...!

find . -name "maple210*.tgz" -exec tar xzvf {} -C ~/work \;

find로 찾은 결과가 {}안에 들어가고 -C는 디렉토리 바꿈

2012년 10월 17일 수요일

우분투 12.04에서 자바 및 이클립스 설치

한번 다 날아갔네영 ㅠ

JAVA6 설치

sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner"
sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu hardy main multiverse"
sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu hardy-updates main multiverse"
sudo apt-get update
sudo apt-get install sun-java6-jdk

요렇게 하면 설치하다가 동의하겠냐고 물어본다...
탭키를 눌러 이동하여 동의하자

이 후 sudo update-alternatives --config java를 치면..

sudo update-alternatives --config java 화면

여기서 내가 설치한 자바 버전을 선택하면 된다.
마찬가지로 javac(컴파일러)도 바꾸어 주면된다.
sudo update-alternatives --config javac


---------------------------------------------------------
만약 java7을 수동설치한다면
1. java.sun.com에서 자신에게 맞는 버전의 자바를 받는다.

2. sudo tar zvxf jdk-7u7-linux-i586.tar.gz -C /usr/lib/jvm/
여기에 자바 7버전을 푼다.

3. sudo update-alternatives --install "/usr/bin/java" java "/usr/lib/jvm/jdk1.7.0_07/bin/java" 1
sudo update-alternatives --install "/usr/bin/javac" java "/usr/lib/jvm/jdk1.7.0_07/bin/javac" 1

4. sudo update-alternatives --config java
    sudo update-alternatives --config javac
    설치한 버전으로 바꾸자

------------------------------------------------------------

sudo apt-get install eclipse

이클립스 설치!

------------------------------------------------------------
이클립스를 설치하고 실행하면 안될거다
Could not load SWT library 에러가 뜨기 떄문에..

32비트는
ln -s /usr/lib/jni/libswt-* ~/.swt/lib/linux/x86/

64비트는
ln -s /usr/lib/jni/libswt-* ~/.swt/lib/linux/x86_64/

이렇게 해서 이클립스 설치가 완료되었다.



--------------------------------------------------------------
첫번째 처럼 버전을 바꾸어주는 것도 좋지만
가장 안정적인 방법은 심볼릭 링크를 만들고 path는 그걸 가리키게 하고
버전을 바꿀때는 통짜로 바꾸는게 가장 좋은 방법인것 같다..

안드로이드 컴파일 시 피 많이 봤다.. ㅠ