2010년 1월 18일 월요일

cmake, 실행하는데 여러 파일이 필요한놈한테 파일 모아주기

퇴원후 첫글이네 흠.

ogre 1.6 을 구경하고있는데 이게 빌드후 실행시 여려가지 dll 하고 리소스 들이 필요하더라.
리소스는 복사하긴 좀 덩치가 커서 코드내에서 $OGRE_HOME 을 기준으로 찾게했고 ( 보통 cfg 를 쓰도록 구성되어있는데 이건 내취향이 아니다. 적어도 샘플수준 코드라면 이런저런 파일을 들고다니는건 귀찮기만 할 뿐. 코드에 박는게 속편하다.) 그외 dll 들은 적당히 복사를 해서 쓰도록 했다.

어쨌건 정리해두면 먼저 exe, dll 들이 모이는 디렉토리를 만들고 cmake 가 만드는 출력을 이쪽으로 돌렸다. 아.. ogre 쪽 dll 도 복사하도록 추가했다.

file(MAKE_DIRECTORY ${CMAKE_BINARY_DIR}/out)
set_output_dir(${CMAKE_BINARY_DIR}/out)
copy_ogre_dlls(${CMAKE_BINARY_DIR}/out)

위에서 아래두줄은 내가만든 매크로.. 소스는 요렇다.

# 컴파일 결과를 한곳으로.
# cmake 로 dll 들을 서브프로젝트로 만들경우 exe 와 다른 디렉토리에 떨어져 불편하니 이걸 써먹자.
# 예)
# set_output_dir(${CMAKE_BINARY_DIR}/out)
macro(set_output_dir dir)
  set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${dir} CACHE PATH "Single Directory for all Libraries")
  set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${dir} CACHE PATH "Single Directory for all Executables")
  set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${dir} CACHE PATH "Single Directory for all static libraries")
endmacro(set_output_dir dir)

macro(filecopy src dst)
  configure_file("${src}" "${dst}" COPYONLY)
endmacro(filecopy src dst)

macro(copy_ogre_dlls dir)
  if(CMAKE_BUILD_TYPE MATCHES Debug)
    filecopy("${OGRE_HOME}/bin/debug/OgreMain_d.dll" "${dir}")
    filecopy("${OGRE_HOME}/bin/debug/RenderSystem_Direct3D9_d.dll" "${dir}")
    filecopy("${OGRE_HOME}/bin/debug/Plugin_OctreeSceneManager_d.dll" "${dir}")
    filecopy("${OGRE_HOME}/bin/debug/OIS_d.dll" "${dir}")   
  else()
    filecopy("${OGRE_HOME}/bin/release/OgreMain.dll" "${dir}")
    filecopy("${OGRE_HOME}/bin/release/RenderSystem_Direct3D9.dll" "${dir}")  
    filecopy("${OGRE_HOME}/bin/release/Plugin_OctreeSceneManager.dll" "${dir}")
    filecopy("${OGRE_HOME}/bin/release/OIS.dll" "${dir}")
  endif()
endmacro(copy_ogre_dlls dir)

흠, 참고로 ogre 샘플제작을 편하게 하려고 만든 매크로도 걍 적어둔다..

macro(link_ogre3d target)
  if(CMAKE_BUILD_TYPE MATCHES Debug)
    target_link_libraries("${target}" OgreMain_d OIS_d)
  else()
    target_link_libraries("${target}" OgreMain OIS)
  endif() 
endmacro(link_ogre3d target)

macro(link_ogre3d_all)
  if(CMAKE_BUILD_TYPE MATCHES Debug)
    link_libraries("${target}" OgreMain_d OIS_d)
  else()
    link_libraries("${target}" OgreMain OIS)
  endif() 
endmacro(link_ogre3d_all)



흠 추가로, 원래 configure_file 을 쓰지 않고 cmake -E 를 써보려고 했는데 그쪽은 좀 성가셔서 하다 말았다. configure_file 은 cmake 가 실행되는 시점에 복사를 하는거라 흠.. 정확히 내가 원하는 동작은 아닌데.. 뭐 별수없지.


아.. ogre 에 대해서도 좀 적어둔다.
흠 3D 는 전혀 모르지만 접근하는데 큰 무리는 없더라. 물론 3D 를 모르니 의미없는 접근이지만. 어쨌건 예제들이 간단한 프레임웍들을 끼고있어서 scratch 에서부터 시작하는게 좀 짜증났다. cfg 등을 남발하는 구조도 초기접근시 좀 더러웠고.






댓글 없음: