1. 개요

 

이 문서는 ARM 보드에서 동작하는 C 프로그램이 루아 스크립트를
호출하여 실행하는 것에 대하여 시험하는 소스를 제안하고
설명한 문서입니다.

이 문서에서는 다음과 같은 내용을 다룹니다.

 

* 루아 스크립트 라이브러리를 포함하는 C 컴파일 용 Makefile
* 루아 스크립트를 호출하는  C 샘플  main.c
* 호출 되는 루아 스크립트 run.lua
 
2. 실습 구성

 

다음과 같은 디렉토리 구성을 하였습니다.

 

/project/lua/sample_lua_arm/lua_include  : LUA 헤더 파일 모음
/project/lua/sample_lua_arm/lua_lib    : LUA 라이브러리 소스 모음
/project/lua/sample_lua_arm/lua_samples  : 앞으로 진행할 강좌의 소스 들
    
3. 기본 샘플 구성

 

소스는 다음 디렉토리에 위치 합니다.
 
/project/lua/sample_lua_arm/lua_samples/020_call_lua_script_simple

 

이 디렉토리에는 다음과 같은 파일이 있습니다.

 

Makefile
main.c    
run.lua
    
4. Makefile 추가 사항

 

이전에 소개한 내용에 다음 부분이 추가 되었습니다.

 

     LUA_SRCS = run.lua

 

부분과

 

all :  $(TARGET) $(LUA_SRCS)
       cp $(TARGET) $(TARGET_NFS)
      cp $(LUA_SRCS) $(TARGET_NFS)

 

에 루아 소스가 변동이 생기면 자동 복사가 이루어 지도록 추가 되었습니다.

【Makefile】

 
# CROSS_PREFIX = arm-linux
TARGET     = app_run_lua
TARGET_NFS = /nfs/lua
C_SRCS =
C_SRCS += main.c
LUA_SRCS = run.lua
# LUA Support  -- CORE 
C_SRCS += ../../lua_lib/lapi.c
C_SRCS += ../../lua_lib/lcode.c
C_SRCS += ../../lua_lib/ldebug.c
C_SRCS += ../../lua_lib/ldo.c
C_SRCS += ../../lua_lib/ldump.c
C_SRCS += ../../lua_lib/lfunc.c
C_SRCS += ../../lua_lib/lgc.c
C_SRCS += ../../lua_lib/llex.c
C_SRCS += ../../lua_lib/lmem.c
C_SRCS += ../../lua_lib/lobject.c
C_SRCS += ../../lua_lib/lopcodes.c
C_SRCS += ../../lua_lib/lparser.c
C_SRCS += ../../lua_lib/lstate.c
C_SRCS += ../../lua_lib/lstring.c
C_SRCS += ../../lua_lib/ltable.c
C_SRCS += ../../lua_lib/ltm.c
C_SRCS += ../../lua_lib/lundump.c
C_SRCS += ../../lua_lib/lvm.c
C_SRCS += ../../lua_lib/lzio.c
# LUA Support  -- LIB
C_SRCS += ../../lua_lib/lauxlib.c
C_SRCS += ../../lua_lib/lbaselib.c
C_SRCS += ../../lua_lib/ldblib.c
C_SRCS += ../../lua_lib/liolib.c
C_SRCS += ../../lua_lib/lmathlib.c
C_SRCS += ../../lua_lib/loslib.c
C_SRCS += ../../lua_lib/ltablib.c
C_SRCS += ../../lua_lib/lstrlib.c
C_SRCS += ../../lua_lib/loadlib.c
C_SRCS += ../../lua_lib/linit.c
INCLUDES += -I. 
INCLUDES += -I/usr/local/include
INCLUDES += -I/usr/$(CROSS_PREFIX)/include
INCLUDES += -I../../include
INCLUDES += -I../../lua_include
LDFLAGS += -L../../lua_lib/
LDFLAGS += -L/usr/$(CROSS_PREFIX)/lib
LIBS    = -lm
CFLAGS   += $(INCLUDES)
CFLAGS   += -Wall -O2 -g
ARFLAGS = rs
#---------------------------------------------------------------------
CC           = $(CROSS_PREFIX)-gcc
AR           = $(CROSS_PREFIX)-ar rc
AR2          = $(CROSS_PREFIX)-ranlib
RANLIB       = $(CROSS_PREFIX)-ranlib
LD           = $(CROSS_PREFIX)-ld
NM           = $(CROSS_PREFIX)-nm
STRIP        = $(CROSS_PREFIX)-strip
OBJCOPY      = $(CROSS_PREFIX)-objcopy
CP = cp
MV = mv
#--------------------------------------------------------------------
C_OBJS    = $(C_SRCS:%.c=%.o)
%.o:%.c
 @echo "Compiling $< ..."
 $(CC) -c $(CFLAGS) -o $@ $<
all :  $(TARGET) $(LUA_SRCS)
 cp $(TARGET) $(TARGET_NFS)
 cp $(LUA_SRCS) $(TARGET_NFS)
$(TARGET) : $(C_OBJS)
 $(CC) $(LDFLAGS) $(C_OBJS) -o $@ $(LIBS)
dep :
 $(CC) -M $(INCLUDES) $(C_SRCS) > .depend
clean:
 rm -f *.bak
 rm -f *.map
 rm -f *.o
 rm -f $(C_OBJS)
 rm -f $(TARGET) core
distclean: clean
 rm -rf .depend
ifeq (.depend,$(wildcard .depend))
include .depend
endif
 

【run.lua】

 

 print( "ENTER RUN.LUA" )
print( "BEGIN........." )
A = 3
B = 4
C = A + B
print( A , "+", B, "=", C );
print( "END........." )

【main.c】

 

 #include <stdio.h>
#include <string.h>
#include <lua.h>
#include <lauxlib.h>
#include <lualib.h>
#define LUA_FILENAME   "run.lua"
int main( int argc, char **argv ) 
{
    lua_State   *L = NULL;  
    int         error;
    
    printf( "sample : C function call Lua Script \n" );
        
    L = luaL_newstate();                            // <---  (1)
    luaL_openlibs(L);                               // <---  (2)
    
    error =  luaL_loadfile( L, LUA_FILENAME )       // <---  (3)
          || lua_pcall    ( L, 0,0,0    );          // <---  (4)
          
    printf( "Enter C routine\n" );                  
    if( error )                                     // <---  (5)
    {
        fprintf(stderr,"%s\n", lua_tostring(L,-1)); // <---  (6)
        lua_pop(L,1);                               // <---  (7)
    }
    
    lua_close(L);                                   // <---  (8)
    
    printf( "sample end\n" );                   
    return 0;
}

6 소스 설명

 

(1) 루아 스크립트를 동작 시키기 위한 구조체를 생성합니다.
    보통 루아 스테이터스 라고 합니다.
 
(2) 루아 스크립트에서 기본적으로 지원하는 표준 라이브러리를 오픈 합니다.
     최소한의 함수들을 제공하도록 지원하는 것입니다 .
 
(3) 파일을 읽어 루아 구조체로 받아 들입니다. 이 단계에서
    스크립트의 파씽이 이루어 집니다.

(4) 스크립트를 실제로 수행 시켜주는 부분입니다.

(5)(6)(7) 수행 과정에 에러가 발생하면 error 변수가 0이 아닌 상태가 되므로 이때 해당 내용을
    출력합니다.
  
    에러 상태는 루아 스택( 이후 강좌에서 다룸 )에 남아 있으므로 이를 제거 합니다.

(8) 스크립트가 종료되면 루아 스테이터스를 소멸 시킵니다.
   

7 수행 예

 

 다음은 보드에서 수행한 예 입니다.
 
[root@falinux nfs]$ ./app_run_lua
sample : C function call Lua Script
ENTER RUN.LUA
BEGIN.........
3 + 4 = 7
END.........
Enter C routine
sample end
[root@falinux nfs]$