2017-05-24 60 views
0

我有這個調用matlab來將.slx文件編譯成.dll文件的自定義構建。避免在不必要的時候在cmake中執行自定義命令

function(BUILD_SIMULINK model) 
    set(EXECUTE_COMMAND matlab -r "rtwbuild(${model})") 
    add_custom_target(
     ${model} ALL 
     COMMAND   ${EXECUTE_COMMAND} 
     DEPENDS   ${CMAKE_CURRENT_SOURCE_DIR}/${model}.slx 
     OUTPUT   ${CMAKE_CURRENT_BINARY_DIR}/${model}.dll 
     WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR} 
     COMMENT   "Building: ${model}" 
    ) 
endfunction(BUILD_SIMULINK) 

但我的問題是,每當我用cmake --build .,這個命令就一定會執行。

當DEPENDS沒有改變並且OUTPUT存在時,我該如何防止執行該命令?我在尋找的內容類似於cmake在源文件沒有改變並且存在適當的目標文件時避免重新編譯c/cpp文件。

回答

1

add_custom_target() command documentation

目標沒有輸出文件,是總是認爲過時,即使命令嘗試創建與目標的名稱的文件。使用add_custom_command()命令生成一個具有依賴關係的文件。

有沒有OUTPUT關鍵字。我認爲它只被接受,因爲CMake認爲OUTPUT是一個依賴項。其實我得到的CMake警告,當我運行代碼:

... 
This project specifies custom command DEPENDS on files in the build tree 
that are not specified as the OUTPUT or BYPRODUCTS of any 
add_custom_command or add_custom_target: 

test_model.dll 

您需要使用add_custom_command()

cmake_minimum_required(VERSION 2.6) 

project(TestCustomTargetWithDependency NONE) 

function(BUILD_SIMULINK model) 
    #set(EXECUTE_COMMAND matlab -r "rtwbuild(${model})") 
    set(EXECUTE_COMMAND "${CMAKE_COMMAND}" -E touch "${model}.dll") 
    add_custom_command(
     OUTPUT   "${model}.dll" 
     COMMAND   ${EXECUTE_COMMAND} 
     DEPENDS   "${model}.slx" 
     COMMENT   "Building: ${model}" 
    ) 

    add_custom_target(
     ${model} ALL 
     DEPENDS   "${model}.dll" 
    ) 
endfunction(BUILD_SIMULINK) 

file(WRITE "test_model.slx" "") 
BUILD_SIMULINK(test_model) 

:來源/依賴默認爲CMAKE_CURRENT_SOURCE_DIR和輸出默認爲CMAKE_CURRENT_BINARY_DIR。不需要明確地前綴這些。

相關問題