삽질하는플머

'monodevelop'에 해당되는 글 2건

  1. Synology NAS DS110j 에 mono 올리기 2
  2. Unity 3D 설치. MonoDevelop 와의 첫 만남.

Synology NAS DS110j 에 mono 올리기

이런저런잡다구리/Synology-nas



Synology NAS 에 mono 를 올리면 아주 신나는 일이 많이 생길 것 같아. 
닷넷 바이너리가 직접 돌아간다면 윈도에서 작업한 이런 저런 물건들을 쉽게 돌려볼 수 있잖아~ 
ipkg system이 설치된 DS110j 는 "ipkg install mono" 명령으로 2.4 버전의 모노를 설치할 수 있지만
닷넷 4.0 바이너리를 구동하려면 mono 버전이 2.8 이상이 되어야 하니... 직접 빌드하는 방법을 찾아보자. 

일단 구글을 뒤적뒤적. Synology DS211 에 mono-2.11.0 을 올리는 방법이 잘 정리된 아주 멋진 블로그를 건짐. 

http://blog.hexad.dk/2012/03/mono-211-binary-build-for-synology-211.html



이 글을 적는 시점에서 최신버전은 2.11.1 이니 그걸로 해보자. 과정은 위의 링크와 동일.
먼저 빌드에 필요한 패키지들을 설치한다. 

# ipkg install wget make automake autoconf bison glib libc-dev libstdc++ m4 gcc gawk textutils gettext zlib



mono 2.11.1 의 소스를 내려받고 압축을 푼다. 그리고 빌드 준비. 

configure 에서 --prefix 파라미터를 통해 /usr 가 아닌 /opt/mono-2.11 에 설치한다. 
혹시 나중에 제거할 일이 생겨도 이렇게 해 두면 편하다. 


# wget "http://download.mono-project.com/sources/mono/mono-2.11.1.tar.bz2"

# tar -xf mono-2.11.1.tar.bz2

# cd mono-2.11.1

# ./configure --prefix=/opt/mono-2.11.1



다음 파일들을 편집기에서 열어준다. 


mono/metadata/Makefile

mono/mini/Makefile

mono/profiler/Makefile



아래 라인을 찾아서 


LDFLAGS = 



-lrt 플래그를 추가해준다. 이유는 여기를 클릭. 


LDFLAGS = -lrt 



ipkg 에서 제공되는 pthreads 라이브러리에 문제가 있기 때문에, 빌드를 위해서는 원래의 pthreads 로 바꿔주어야 한다. 

방법은 다음과 같다. 

# mkdir /opt/arm-none-linux-gnueabi/lib_disabled
# mv /opt/arm-none-linux-gnueabi/lib/libpthread* /opt/arm-none-linux-gnueabi/lib_disabled
# cp /lib/libpthread.so.0 /opt/arm-none-linux-gnueabi/lib/
# ln -s /opt/arm-none-linux-gnueabi/lib/libpthread.so.0 /opt/arm-none-linux-gnueabi/lib/libpthread.so
# ln -s /opt/arm-none-linux-gnueabi/lib/libpthread.so.0 /opt/arm-none-linux-gnueabi/lib/libpthread-2.5.so


DS110j 는 아주 느린 환경이므로 빌드는 지루한 작업이다. 
혹시라도 중간에 네트웍에 문제가 생겨 SSH 연결이 끊기면 말짱 황이므로 screen 의 사용을 적극 권장한다. 

# ipkg install screen


screen은 딱 네가지만 기억하면 된다. 실행은 screen, 디태치는 Ctrl+A+D, 다시 붙일 때는 screen -r, 종료는 exit. 
좀 더 자세한 사용기는 여기를 클릭

이제 빌드 시작. 

# make


정말 하루 종일 걸린다. 헥헥... 다 끝났으면 다음 명령으로 /opt/mono-2.11.1 에 설치

# make install


인생을 좀 편하게 살기 위해 몇개의 심볼릭 링크를 만들어주자. 

# ln -s /opt/mono-2.11.1/bin/mono /opt/bin/mono
# ln -s /opt/mono-2.11.1/bin/mcs /opt/bin/mcs
# ln -s /opt/mono-2.11.1/bin/gmcs /opt/bin/gmcs


실행시켜보면 

# mono --version







설치가 끝났으니 제대로 굴러가는지 테스트를 해 봐야지. 
SharpDevelop 를 실행시키고 간단한 콘솔프로그램을 만들어 보자. 



윈도에서 실행시킨 모습. 





컴파일된 console.exe 를 NAS 로 옮겨서 돌려보자. 

# mono ./console.exe



지난번 포스트에서 테스트했던 간단한 C# 에코서버도 물론 잘 동작한다. 



초기 구동은 아무래도 느리지만, 반응은 제법 빠릿빠릿 하다. 아주 만족스럽네.
간단한 채팅서버나 작은 게임서버 정도는 충분히 돌릴 수 있을 듯. 



Unity 3D 설치. MonoDevelop 와의 첫 만남.

여가생활/Unity,Mono&.Net
Unity 3D 는 알게 모르게 어느새 대세가 되어있는 무시하기 힘든 멋진 물건. 
4월 8일까지 iOS, 안드로이드 빌드가 가능한 Basic 버전을 무료로 배포하는 통 큰 행사덕에 일단 다운받아 깔아보았다.
말로만 듣던 MonoDevelop 도 한번쯤 써보고 싶었고...

유니티와 함께 설치된 MonoDevelop 는 유니티용으로 필요한 것만 추린 물건이라 많은 부분이 비어있다.
윈도나 하나 띄워볼까 싶어 GTK 프로젝트를 생성하니 에러만 빠바방~  심지어는 디버거도 없다.  

일단 GTK# 부터 설치해보자. 
http://monodevelop.com/Download 

여기서 윈도 아이콘을 눌러주면  "GTK# for .NET 2.12.10" 을 내려받을 수 있는 링크가 나타난다. 




설치한 후 생성된 .NET 바이너리를 실행시키려면 GTK# 이 설치된 디렉토리에 PATH가 걸려있어야 한다. 
바로 적용되지 않으니 시스템->등록정보에서 환경변수를 한 번 확인해주거나 귀찮으면 그냥 재부팅 하자.

이제 MonoDevelop 에서 GTK# 프로젝트를 생성하고 GUI Designer 를 사용할 수 있다. 








유니티용 MonoDevelop는 유니티용으로 이런저런 설정이 추가된 물건이라 그런지 디버거도 빠져있다. 
어차피 유니티용이고 스크립트 작업시 디버거로 유니티 자체를 실행시키도록 되어있으니 빼버린 듯 하다. 
뭐 정 필요하면 독립적인 MonoDevelop을 내려받아 쓰면 될 일이고... 어차피 C#을 다른 곳에 쓸 일은 없으니 일단 패스. 
다만 일반적인 어플을 만들때와 달리 유니티에서 띄우면 Run 메뉴가 비활성화되고 Debug 메뉴만 살아있는 게 신기하군. 
유니티 프로젝트를 불러왔을 때 Reference 에 UnityEngine.dll 이 포함되어있는 것과 관련이 있는 듯. 



실제로 그런지 파보자. Hello World를 출력해주는 빈 콘솔 프로젝트를 시작하고 컴파일. 이 시점에서 Run 메뉴는 아직 살아있다. 




솔루션 브라우저에서 "References" 를 우클릭하고 "Edit Preferences" 메뉴를 선택한 뒤 ".Net Assemply" 탭에서 유니티가 설치된 디렉토리 아래 .../Editor/Data/Managed/ 폴더로 이동, UnityEngine.dll 을 선택한 뒤 Add버튼을 눌러준다. 



이 DLL을 포함시키는 순간, MonoDevelop의 Run 메뉴는 비활성화되고 Debug 메뉴가 활성화된다. 
UnityEngine 네임스페이스에 접근할 수 있으므로 UnityEngine의 자료형을 테스트 해볼 수도 있다. 

.....

UnityEngine.Vector3 vt = UnityEngine.Vector3.left;
Console.WriteLine ("{0}, {1}, {2}", vt.x, vt.y, vt.z);

...... 


실행버튼이 비활성화되어있으니 Ctrl+F8로 빌드하고 생성된 실행파일을 탐색기에서 직접 돌려보자. 



오호~~ 뭔가 감이 잡히는 듯 해~~

당연한 얘기겠지만, 이렇게 만들어진 실행파일은 유니티 프로젝트가 아니므로 실제 뭔가를 하는 것은 불가능하다.
틱을 얻기 위해 여기저기 찔러서 알아낸 다음과 같은 코드도 빌드는 되지만 실행시키면 에러가 난다. 

......
float f = UnityEngine.Time.realtimeSinceStartup;
Console.WriteLine(f);



그래도 유니티와 모노가 이렇게 연결되어 동작하는구나~~ 짐작하게 되었으니 이것만으로도 큰 수확!

 



실제로 간단한 코드를 만들어 디버깅을 걸어보자. 
델파이를 오래 쓰다보니 뭔가 하려면 무조건 GUI가 있어줘야 하는 부작용이 있네. 
기왕 이렇게 된 거, 유니티의 GUI 요소들을 직접 가지고 놀아보자. 

GUI 스크립팅에 대한 레퍼런스 메뉴얼은 여기 .
http://unity3d.com/support/documentation/Components/GUI%20Scripting%20Guide.html 

유니티 강좌는 여기저기 많이 있으니 자세한 설명은 패스. 
유니티를 실행하고 빈 프로젝트를 생성하고 프로젝트 창에서 우클릭, GuiTest 라는 C#스크립트를 생성하자.
이 스크립트를 더블클릭하면 MonoDevelop가 실행된다. 여기에 다음과 같이 코딩해준다. 

using UnityEngine;
using System.Collections;

public class GuiTest : MonoBehaviour {

void OnGUI () {
if (GUI.Button (new Rect (10,10,150,100), "I am a button")) {
float f = Time.realtimeSinceStartup;
print ("Time from Start: " + f);
}
}
}





이 녀석을 끌어다 Hierachy 에 외롭게 혼자 있는 MainCamera 에 던져넣자. 



 
"Main Camera" 를 선택하고 Inspector 를 살펴보면 방금 추가한 GuiTest가 아래쪽에 보인다. 

 

Ctrl+Shift+C 를 눌러 콘솔을 띄운 뒤 유니티 상단의 실행 아이콘을 눌러주자. 
Game창에 버튼이 하나 생겨나고 이 버튼을 누를 때 마다 콘솔창에 이 게임이 실행된 후 경과된 시간값이 초단위로 출력된다. 


 
이제 실제로 디버깅을 걸어보자. 유니티를 닫고 모노만 남겨둔다.

모노에서 Run->Debug 메뉴를 선택하면 유니티가 다시 실행되면서 디버깅이 연결된다. 
아까 스크립트의 실행을 연결해두었던 MainCamera 가 어찌된 일인지 사라져버렸다. 
뭐 GameObject->CreateOther->Camera를 선택해 다시 만들자. 
새로 추가한 Camera에 아까와 같은 요령으로 GuiTest 스크립트를 연결해주고 실행아이콘을 누른다. 
모노에서 Print (...) 부분에 F9키로 브레이크 포인트를 걸고 유니티의 게임창에서 Gui버튼을 눌러보자. 

 

 

게임 실행이 브레이크 포인트에서 멈춘다. GUI버튼도 눌린 상태로 멈춰있다. 
당연히 Watch도 잘 동작한다. Step Over 로 한줄씩 지나가며 상태가 궁금한 변수는 들여다 볼 수 있다.
함수가 있다면 Step Into, Step Out 으로 들락날락 할 수도 있다. 이정도면 뭐~~ 쓸만하다. 

하지만... 디버깅이 길어질 수록 유니티가 더럽게 느려진다는 게 문제. 그리고 디버깅을 하려면 유니티를 다시 띄워야 하는 것도 불만.
기존 작업중인 상태에서 직접 디버거를 연결할 수 있다면 자주 쓰겠는데... 이 부분은 좀 더 뒤져봐야겠다. 


덤.
느려지는 문제가 집에 컴터가 꾸져서 그런가 싶었는데... 회사에서 재연해보니 마찬가지임. 

 
 덤 2. 
아직 유니티 문서 보는데 익숙치 않아서 해메게 되네. 암튼 찾아보니 디버깅에 대해 잘 정리된 문서가 있다. 
http://unity3d.com/support/documentation/Manual/Debugger.html 

Assets -> "Sync ModeDevelop Project" 메뉴를 한 번 실행시킨다. 
모노에서 Run -> Attack to Process... 메뉴를 선택한 뒤 실행중인 유니티 프로세스를 골라주면 끝!!
이 방법은 개발버전으로 빌드된 결과물들을 디버깅 할 때도 동일하다.