2011-05-12 28 views
26

這是我第一次嘗試使用cmake,如果可能的話,我想盡可能地反饋一些關於我做什麼的問題,因爲有些問題仍然存在。使用cmake中的自動工具創建庫

在庫文件夾的CMakeLists.txt中,我創建了兩個生成文件目標:configure-antlr3cantlr3c。第一個目標運行自動工具配置shell腳本,第二個運行做出可執行建庫:

# CMakeLists.txt in libantlr3c-3.1.3 
add_custom_target(
    configure-antlr3c 
    ${SHELL_EXECUTABLE} configure 
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 
) 

add_custom_target(
    antlr3c 
    ${MAKE} 
    DEPENDS configure-antlr3c 
    WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} 
) 

的主要問題是,configure-antlr3c目標始終是「過時的」,所以它總是會被執行即使沒有發生變化。此外,我必須生成我的cmake makefiles在一個單獨的目錄(不在我的項目的根目錄),以避免覆蓋自動工具庫的Makefile ...

有沒有人有這個問題(建設自動工具項目cmake)?如果是這樣,你的解決方案是什麼?

謝謝。

編輯:解 在根的CMakeLists.txt:

include(ExternalProject) 
ExternalProject_Add(
    libantlr3c 
    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib/libantlr3c-3.1.3 
    CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/lib/libantlr3c-3.1.3/configure --prefix=${CMAKE_CURRENT_SOURCE_DIR}/lib/libantlr3c-3.1.3 
    PREFIX ${CMAKE_CURRENT_SOURCE_DIR}/lib/libantlr3c-3.1.3 
    BUILD_COMMAND make 
    BUILD_IN_SOURCE 1 
) 
+1

您應該將您的解決方案添加到Answer塊;不在問題中。 – jww 2017-10-27 17:46:54

回答

37

我認爲你會更好使用cmake的ExternalProject功能。我想你有你的項目和libantrl在一個子目錄?

project 
     +- libantlr 
     +- mysrc 
    ---- etc ---- 

如果是這樣的話,你可以做這樣的事情在頂層的CMakeLists.txt:

cmake_minimum_required(VERSION 2.8) 
project(test) 
include(ExternalProject) 
ExternalProject_Add(libantlr 
    SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/libantlr 
    CONFIGURE_COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/libantlr/configure --prefix=<INSTALL_DIR> 
    BUILD_COMMAND ${MAKE}) 

<INSTALL_DIR>擴展到像libantlr前綴,這樣的事情都安裝在您的構建樹而不是在/ usr/local中,這是自動工具在沒有前綴的情況下會執行的。

+0

完美!這跟蹤了我編譯它的事實,並且我不需要每次有依賴時都創建它。非常感謝;) – 2011-05-12 11:00:48

+1

很好的答案。只要考慮到「configure」需要「--prefix」的絕對路徑。 – 2013-11-19 15:40:00