2016-09-28 82 views
2

我想用cmake來鏈接我的項目。CMAKE_CXX_FLAGS中重複的編譯標誌

我需要找到一個包mypack,它會給我mypack_definitionsmypack_flagsmypack_include_dirsmypack_libraries。這裏mypack_flags包含鏈接mypack的相關標誌。我會將mypack_flags添加到CMAKE_CXX_FLAGS

請參閱下的CMakeLists.txt:

cmake_minimum_required(VERSION 2.8) 
project(QMCLIB C CXX) 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fopenmp") 

find_package(mypack REQUIRED) 

add_executable(QMC codeA.cpp codeB.cpp) 
add_definitions(${mypack_definitions}) 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${mypack_flags}") 
target_link_libraries(QMC ${mypack_libraries}) 
target_include_directories(QMC PUBLIC ${mypack_include_dirs}) 

但是依賴於系統,mypack_flags威力或不含-fopenmp,當它含有-fopenmp,我CMAKE_CXX_FLAGS將有兩個-fopenmp。我不能在

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fopenmp") 

如果我刪除它刪除-fopenmp,當mypack_flags不包含-fopenmp,那麼我將在CMAKE_CXX_FLAGS沒有-fopenmp

有沒有辦法強制cmake只使用一個-fopenmp?或者可以有兩個-fopenmp?謝謝你的建議。

============================================== ========================

感謝羅伯特·普雷沃,這裏是一個通用函數刪除重複的字符串:

function(removeDuplicateSubstring stringIn stringOut) 
    separate_arguments(stringIn) 
    list(REMOVE_DUPLICATES stringIn) 
    string(REPLACE ";" " " stringIn "${stringIn}") 
    set(${stringOut} "${stringIn}" PARENT_SCOPE) 
endfunction() 

我們可以通過調用這個函數:

removeDuplicateSubstring(${CMAKE_CXX_FLAGS} CMAKE_CXX_FLAGS) 

回答

1

除了list(REMOVE_DUPLICATES <list>)的解決方案,我會建議避免使用CMAKE_CXX_FLAGS也不add_*命令,並且更喜歡target_*命令代替:

你cmake的文件可能會變得這樣的事情:

cmake_minimum_required(VERSION 2.8) 
project(QMCLIB C CXX) 

function(removeDuplicateSubstring stringIn stringOut) 
    separate_arguments(stringIn) 
    list(REMOVE_DUPLICATES stringIn) 
    string(REPLACE ";" " " stringIn "${stringIn}") 
    set(${stringOut} "${stringIn}" PARENT_SCOPE) 
endfunction() 

find_package(mypack REQUIRED) 

set(mycompile_options -fopenmp ${mypack_flags}) 

removeDuplicateSubstring(${mycompile_options} mycompile_options) 

add_executable(QMC codeA.cpp codeB.cpp) 
target_compile_definitions(QMC PUBLIC ${mypack_definitions}) 
target_compile_options(QMC PUBLIC ${mycompile_options}) 
target_compile_features(QMC PUBLIC cxx_constexpr) 
target_include_directories(QMC PUBLIC ${mypack_include_dirs}) 
target_link_libraries(QMC ${mypack_libraries}) 
3

有一種方法,使CMake的僅包括一個-fopenmpCMAKE_CXX_FLAGS是一個可以搜索子字符串的字符串。您可以根據您是否已在CMAKE_CXX_FLAGS中有條件地添加-fopenmp。假設您小心不要添加兩次,那麼您可以使用以下檢查來查看是否需要添加它。

# find "-fopenmp" 
string(FIND ${CMAKE_CXX_FLAGS} "-fopenmp" FLAG_INDEX) 
# check if we found it 
if (FLAG_INDEX GREATER 0) 
    message(STATUS "WE'VE GOT AT LEAST ONE!") 
else() 
    message(STATUS "WE'VE GOT NONE; ADD IT!") 
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp") 
endif() 

爲了安全起見,你可以刪除的-fopenmp所有實例,然後添加回。

# remove all occurrences of "-fopenmp" 
string(REPLACE "-fopenmp" "" CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS}) 
+0

非常感謝,我寫了一個功能,然後你的想法。它刪除字符串中的重複子字符串。 –