2016-09-28 12 views
2

に私は自分のプロジェクトをリンクするcmakeのを使用しようとしています。重複コンパイルフラグがCMAKE_CXX_FLAGS

は、私はそれが私にmypack_definitionsmypack_flagsmypack_include_dirs、およびmypack_librariesを与える、パッケージmypackを見つける必要があります。ここでmypack_flagsには、mypackをリンクするための関連フラグが含まれています。私はCMAKE_CXX_FLAGSmypack_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}) 

しかし-fopenmpを含んで、システムに依存mypack_flagsかもしれないかどうか、それは-fopenmpが含まれている場合、私のを持つことになります。私はそれを削除した場合、私はmypack_flags-fopenmpが含まれていない場合には、その後、私はCMAKE_CXX_FLAGSには-fopenmpを持っていないだろう、

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

-fopenmpを削除することはできません。

強制的に使用する方法はありますか?-fopenmp?それとも2つ持っているのですか?-fopenmp?提案ありがとう。

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

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

:========================ロバート・プレボーへ

おかげで、ここでの重複した部分文字列を除去するための一般的な機能でありますCMakeのは一つだけ-fopenmpを含めるようにする方法があり

removeDuplicateSubstring(${CMAKE_CXX_FLAGS} CMAKE_CXX_FLAGS) 

答えて

1

、私はCMAKE_CXX_FLAGSadd_*コマンドを使用しないようにアドバイスし、好みます代わりに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_CXX_FLAGSは、部分文字列を検索できる文字列です。 CMAKE_CXX_FLAGSに既にあるかどうかに基づいて条件付きで-fopenmpを追加できます。あなたはすでにそれを2回追加しないように注意したと仮定すると、あなたはそれを追加する必要があるかどうかを確認するために、以下のチェックを使用することができます。 list(REMOVE_DUPLICATES <list>)ソリューションを越えて

# 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

どうもありがとう、私はあなたのアイデアが続く関数を記述します。文字列中の重複した部分文字列を削除します。 –