목요일, 10월 09, 2008

Touch calibration 화면의 문구 바꾸기 (public common module build추적하기)

Touch calibration의 문구를 내 맘대로 바꾸려면 어떻게 해야 하나?
Touch calibration UI을 수정은 아래 public directory의 calibrui.lib에 의해서 이루어 진다.
WINCE600\PUBLIC\COMMON\OAK\DRIVERS\CALIBRUI
그리고 default는 영어지만 locale을 정해줄 경우 locale에 따라서 다른 resource를 사용하게 되는데, 만일 한국어의 경우 아래의 resource을 사용하게 된다.
WINCE600\PUBLIC\COMMON\OAK\LIB\ARMV4I\RETAIL\0412\calibrui.res

그러나 이 calibrui.lib만 가지고는 아무것도 되지 않는다. 수정내용이 반영되려면 최종 DLL이나 exe와 같은 module이 build되어야 하는데 platform쪽의 module build들은 sources들에 의해서 쉽게 추적되지만, public common쪽의 module build은 sysgen과정에서 여러 makefile과 batch file들의 복잡한 동작에 의해서 이루어 진다.
물론 그냥 sysgen을 처음부터 다시 해 주면 되지만, sysgen을 다시하는 전체 build는 보통 30분 이상의 시간이 소요되므로, 자주 수정을 해야 하는 상황에서는 필요한 부분만을 빨리 build하여 반영하는 방법을 알아두어 작업의 효율을 높아진다.
이 경우 makefile들과 batch file들을 추적해 최종 target은 gwes.dll이 된다는 것을 알게 되었다.

그리고 다음과 같은 순서로 build해야 한다.

WINCE600\PUBLIC\COMMON\OAK\LIB\ARMV4I\RETAIL\0412\calibrui.res 에서 문구 수정
set CURRENT_LANGID=0412
WINCE600\PUBLIC\COMMON\OAK\DRIVERS\CALIBRUI\build -cp
sysgen -p common gwes2
sysgen -p common gwes
makeimg

이것은 나중에 별도의 글에서 다시 소개하겠지만 순전히 sysgen_capture tool과 일반 editor의 find in files 기능으로 주요 makefile류의 file들에서 원하는 문구를 추적해 들어감에 의해서 알아낼 수 있다.

우선 calibrui를 검색하여 winceos.bat에서 다음과 같이 calibrui가 사용된다는 것을 알게 된다.

set GWE2_COMPONENTS=%GWE2_COMPONENTS% tchui calibrui

GWE2_COMPONENTS로 다시 검색하면 makefile에서 gwes2.lib가 GWE2_COMPONENTS에 depend on하다는 것과 gwes2.lib은 GWESLIBS로 정의된다는 것을 알게된다.

gwes2::$(GWE2_COMPONENTS)
gwe1 gwe2 gwe3 gwe4::
@set DEFFILE=
@set DLLENTRY=
@set EXEENTRY=
@set TARGETNAME=$@

@set RELEASETYPE=OAK
@set TARGETLIBS=
@set TARGETTYPE=LIBRARY
$(MAKECMD) /NOLOGO $(SG_OUTPUT_OAKLIB)\$@.lib
@set GWELIBS=%%GWELIBS%% $(SG_OUTPUT_OAKLIB)\$@.lib

그리고 GWESLIBS는 gwes_lib.lib를 build하는데 사용된다.

lib_gwes: ceosutil
@set TARGETTYPE=LIBRARY
@set TARGETNAME=gwes_lib
@set RELEASETYPE=OAK
@set TARGETLIBS=
@set SOURCELIBS=%%GWELIBS%% $(SG_OUTPUT_SDKLIB)\ceosutil.lib
@set SOURCEPDBS=$(SG_INPUT_LIB)\mgdi.pdb
@echo Creating gwes_lib.lib $(MAKECMD) /NOLOGO $(SG_OUTPUT_OAKLIB)\gwes_lib.lib

또한 lib_gwes는 gwes.dll이 depend on하는 target이다.

gwes::$(GWES_REPLACE) $(GWES_REPLACE_COMPONENTS) $(GWES_COMPONENTS) lib_gwes
gwes:: 0409_base_resources gwestubs
@set TARGETTYPE=DYNLINK
@set TARGETNAME=$@
@set RELEASETYPE=OAK
@set DEFFILE=$(SG_OUTPUT_OAKLIB)\$@.def
$(SG_TOKENFILTER) $(SG_INPUT_LIB)\$@.def $(SG_OUTPUT_OAKLIB)
@set SOURCELIBS=
@set TARGETLIBS=$(SG_OUTPUT_SDKLIB)\coredll.lib $(SG_OUTPUT_OAKLIB)\gwes_lib.lib $(SG_OUTPUT_SDKLIB)\gwestubs.lib %GWES_TARGET_RESOURCE% $(MAKECMD) /NOLOGO $(SG_OUTPUT_OAKTGT)\gwes.dll
@set DLLENTRY=_DllMainCRTStartup

즉 gwes를 target으로 sysgen하면 denpency에 의해 우선 gwes_lib.lib이 build된다는 것을 알 수 있다. 그리고 또한 gwes_lib.lib을 build하기 위해서는 gwes2.lib이 미리 만들어져 있어야 하지만 따로 dependency가 정의되어 있지 않기 때문에 gwes2.lib을 만들기 위해 gwes2를 target으로 한 sysgen이 먼저 실행되어야 한다. gwes2 또한 calibrui에 depend on하지만 막상 calibrui target은 어떤 library나 module을 build하기 위한 동작을 하지 않는다. calibrui.lib은 sources에 의해서 따로 build된다.

그리고 이런 방식으로 console에서 부분적으로 build하니깐 locale이 반영되지 않아 무조건 미국 locale로만 나온다. 역시 makefile을 보면 CURRENT_LANID가 정의되어 있지 않으면 무조건 미국 locale인 0409가 할당되는 것을 확인 할 수 있다.
그래서 CURRENT_LANID를 0412로 따로 할당해 주는 작업을 한다.

이렇게 해서 결과적으로 처음 이야기한 것과 같은 build 순서가 나오게 된다.
이것을 batch file로 만들어 놓아 source를 조금씩 수정하면서 신속히 build해 수정내용이 어떻게 반영되는지 확인해 가며 coding할 수 있다.

만일 우리가 처음부터 어떤 dll이나 exe가 필요한지 알고있고 있다면 depend on하는 것은 비교적 쉽게 찾을 수 있다. sysgen_capture tool을 사용하면 된다.
'sysgen_capture -p common gwes'명령을 console창에 내리면 sources.gwes를 생성하는데 여기서 다음 정보를 얻을 수있다.
TARGETLIBS=\
$(_SYSGENSDKROOT)\lib\$(_CPUINDPATH)\coredll.lib \
$(_SYSGENOAKROOT)\lib\$(_CPUINDPATH)\gwes_lib.lib \
$(_SYSGENSDKROOT)\lib\$(_CPUINDPATH)\gwestubs.lib \
$(_SYSGENOAKROOT)\target\$(_CPUINDPATH)\0409\gwes.res


그리고 여기에 나열된 lib들이 sources에 의해서 build되는 것이면 상황이 쉬워지는 거고 그렇지 않고 sysgen과정에 생성되는 것이라면 처음과 같은 방법으로 찾아야한다.
sources에 의해서 만들어지는 아닌지는 일반 editorfind in files기능을 사용해서 전체 sources file중에 gwes_lib등의 lib 이름이 있는지 찾아보면 알수 있다.

쉽지 않다.
wince에서 build가 제일 어렵다.

댓글 없음: