TAG

首都機能移轉 (2) 歌詞 (2) 靠北文 (40) 戲言 (30) 糟糕 (7) ACG (23) Assembly (2) Boost (2) C (31) C++ (69) CMake (4) CSIE (67) Debian (34) Design_Pattern (2) Django (1) Eclipse (1) en_US (13) FFmpeg (3) FoolproofProject (26) FreeBSD (2) Git (4) GNU_Linux (65) IDE (5) Java (11) JavaScript (19) KDE (15) Khopper (16) KomiX (3) Kubuntu (18) Life (1) Lighttpd (2) Mac_OS_X (2) Opera (1) PHP (2) PicKing (2) Programing (21) Prolog (1) Python (7) QSnapshot (2) Qt (30) Qt_Jambi (1) Regular_Expression (1) Shell_Script (7) Talk (98) VirtualBox (7) Visual_Studio (13) Windows (18) zh_TW (36)
顯示具有 CMake 標籤的文章。 顯示所有文章
顯示具有 CMake 標籤的文章。 顯示所有文章

2012年8月2日 星期四

CMake: grouping sources by directory

function(group_sources root)
  function(__group_sources__ root prefix)
    file(GLOB entries RELATIVE "${root}" "${root}/*")
    foreach(entry ${entries})
      set(abspath "${root}/${entry}")
      if(IS_DIRECTORY "${abspath}")
        __group_sources__("${abspath}" "${prefix}/${entry}")
      else()
        list(APPEND group "${abspath}")
      endif()
    endforeach()
    string(REPLACE "/" "\\" prefix "${prefix}")
    source_group("${prefix}" FILES ${group})
  endfunction()

  get_filename_component(prefix "${root}" NAME)
  __group_sources__("${root}" "${prefix}")
endfunction()
Usage:
group_sources("${CMAKE_SOURCE_DIR}/src")
group_sources("${CMAKE_SOURCE_DIR}/include")
Note this function only creates filters in project, you still need to add source files by ADD_EXECUTABLE or ADD_LIBRARY commands. For more complete example, see this gist.

2010年2月15日 星期一

Create source groups in Visual C++ solutions with CMake

使用 qmake 時,Visual C++ 的方案會自動把產生的檔案(e.g.: ui_*.h, moc_*.cpp ... etc.)歸類到 Generated Files,讓原始碼樹看起來比較清爽。但是 CMake 不會幫你做這件事,專案一大就會讓這些不必修改的檔案佔滿整個專案。
但是 CMake 其實是可以做到的,使用 SOURCE_GROUP 巨集就可以建造一個群組,把原始碼組織起來。過濾的方式有二:使用 regular expression,或是直接指明檔案路徑。以下是範例。
# 明指 moc, rcc, uic, qm 檔案為 Generated Files
source_group("Generated Files" FILES ${MOC_SOURCES} ${RCC_RESOURCES} ${UIC_HEADERS} ${QM_FILES})
# 使用 RE 把資源檔找出來
source_group("Resource Files" REGULAR_EXPRESSION .*\\.rc)
# 使用 RE 把 Designer forms 歸類在 Form Files
source_group("Form Files" REGULAR_EXPRESSION .*\\.ui)
注意 regular expression 要跳出 \。

2009年12月11日 星期五

CMake to QMake note

前幾天腦袋壞掉把手上的 Qt project 全換成 CMake,原因是 QMake 的功能實在是不太夠用。最糟糕的一點是建置的彈性太差,你很難在 qmake 的執行選項裡更改專案的設定,通常你要直接修改 *.pro files。然後是它的 install 和設定相依性的能力也很差,跟前述的問題一樣,都是寫死的。
CMake 做為一個建置系統(應該說前端)就還算是優秀,對於相依性的處理可以自己寫一套 script 來自動設定,找不到也可以讓使用者手動設定,雖然有些聲音認為 pkg-config 的方式較為方便,但是畢竟在 Windows(Mac 我不確定) 上這東西是不流行的,而且也不是每個專案都有附上 *.pc 設定。
以下是我從 QMake 到 CMake 轉換的對應處理:
前置動作
find_package(Qt4 REQUIRED)
include(${QT_USE_FILE})
這會檢查 Qt4 的設定,然後把該有的 macro 和變數引入。
子專案設定
TEMPLATE = subdirs
SUBDIRS = dir1 dir2
轉換為
add_subdirectory(dir1)
add_subdirectory(dir2)
如果有
CONFIG += ordered
的子專案間相依設定的話,要在各子資料夾內加上設定
add_dependencies(A B)
執行檔的設定
SOURCES = a.cpp b.cpp # ... program sources
TARGET = exec
TEMPLATE = app
改為
set(SOURCES a.cpp b.cpp ... )
add_executable(exec ${SOURCES})
動態連結函式庫
TARGET = shared
TEMPLATE = lib
由於 add_library 預設是生成靜態連結函式庫,要明確指定 SHARED
add_library(shared SHARED ${SOURCES})
Qt plugin
TARGET = $$qtLibraryTarget(plugin)
TEMPLATE = lib
CONFIG += plugin
這裡要自己加上 Qt 的 flags
add_definitions(${QT_DEFINITIONS} -DQT_PLUGIN -DQT_SHARED)
add_library(plugin SHARED ${SOURCES})
Qt 模組,預設是會打開 QtCore 和 QtGui 兩個。
QT += phonon
set(QT_USE_PHONON TRUE)
除了 QtCore 和 QtGui 分別是 QT_DONT_USE_QTCORE 和 QT_DONT_USE_QTGUI 外,其他的都是 QT_USE_XXX。如果發生找不到 header 或是連結錯誤的話,變數分別是 QT_XXX_INCLUDE_DIR 和 QT_XXX_LIBRARY。
QMake 會自動找需要 moc 的 header, 但是 CMake 在這個功能上還沒有完整支援,qt4_automoc macro 需要在原始碼最後加上 #include "header.moc"。如果你不是採用此做法,就只好手動加入需要 moc 的 header;怎麼找呢?找連結錯誤的 compile unit 就好了。
qt4_wrap_cpp(MOC_SOURCES a.h b.h)
add_executable(exe ${SOURCES} ${MOC_SOURCES})
Resource system
RESOURCES = a.qrc b.qrc
一樣要透過 wrapper
qt4_add_resources(RCC_SOURCES a.qrc b.qrc)
add_executable(exe ${SOURCES} ${RCC_SOURCES})
header 位置
INCLUDEPATH += src
include_directories(src)
連結
LIBS += -la -lb
記得也要連結 Qt 自己的 library
target_link_libraries(exe ${QT_LIBRARIES} a b)
如果什麼都沒做的話,在 MSVC 底下會出現多餘的 console prompt,需要做一點手腳
add_executable(exe WIN32 ${SOURCES})
target_link_libraries(exe ${QT_LIBRARIES} ${QT_QTMAIN_LIBRARY})
版本設定
VERSION = 1.2.3
set_target_properties(exe PROPERTIES VERSION 1.2.3)
set_target_properties(lib PROPERTIES VERSION 1.2.3 SOVERSION 1.2.3)
輸出路徑
DESTDIR = build
set(EXECUTABLE_OUTPUT_PATH "${CMAKE_BINARY_DIR}/build")
set(LIBRARY_OUTPUT_PATH "${CMAKE_BINARY_DIR}/build")
基本上是建議除非你真的很閒才轉啦 ...

2008年12月11日 星期四

Uninstall using CMake

CMake基於某些理由並沒有在Makefile裡提供uninstall這個target,但是提出了另一個做法:把所有安裝的檔案路徑記錄到一個叫install_manifest.txt的檔案裡,之後利用xargs rm -vf < install_manifest.txt就可以反安裝了。
不過安裝時更改的設定檔要怎麼辦啊....