1

現在、gccを使用するときにコンパイラフラグを変更するために、ビルドターゲットのCMakeLists.txtを編集します。

if (UNIX)
    add_definitions(-Wall)
    add_definitions(-g)
    #add_definitions(-O2)
endif (UNIX)

これに伴う問題は、gitが変更を取得することです。先に進んでこの変更をコミットすると、-gの代わりに-O2を使用することを期待している他の開発者を苛立たせますが、関係のない変更をプルすると私のバージョンを取得します。通常、この変更をコミットから除外することもできますが、CMakeLists.txtファイルに実際の変更を加えると、コンパイルフラグの個人的な選択を押し上げることを回避する方法はありません。

個々の人がプロジェクトファイル(build /以外のすべて)に触れることなく自分の望みに合わせて変更できるファイル(各作業コピー、したがって各開発者に固有)にファイルを作成するようにCMakeに指示する方法はありますか?当然、build/はgitリポジトリにコミットされていません。

gccの代わりにVisualStudioを使用する場合、IDEはbuild/のVSソリューションファイルを変更するUIを介してこれを処理することに注意してください。問題は、GNUMakefileを使用するときにそのようなメカニズムがないことです。

私たちのプロジェクトは次のように構成されています。

ourproject/
    bin/
    build/ <-- CMake-generated stuff goes here
    lib/
    src/
        abuildtarget/
        anotherbuildtarget/
            source.cpp
            source.h
            CMakeLists.txt
4

2 に答える 2

4

ここで CMake を間違って使用しています。このadd_definitions関数は、あなたが行っているようにコンパイラ オプションを追加するためのものではありません。のようなプリプロセッサ定義を追加することですadd_definitions(-DDEBUG)

あなたがしたいことは、設定CMAKE_<language>_FLAGS時に必要なオプションを設定することです。必要な標準セットがある場合は、次のように CMakeLists.txt ファイルに入れます。

if(${CMAKE_Fortran_COMPILER_ID} STREQUAL "Intel")                                   
  set(CMAKE_Fortran_FLAGS_RELEASE "-O2 -xhost" CACHE STRING "" FORCE)

  set(CMAKE_Fortran_FLAGS_NODEBUG "-O0" CACHE STRING "" FORCE)
  mark_as_advanced(CMAKE_Fortran_FLAGS_NODEBUG)

  set(CMAKE_Fortran_FLAGS_PROFILING "-O2 -xhost -p" CACHE STRING "" FORCE)
  mark_as_advanced(CMAKE_Fortran_FLAGS_PROFILING)

  set(CMAKE_Fortran_FLAGS_DEBUG
      "-DDEBUG -g -check noarg_temp_created -C -traceback" CACHE STRING "" FORCE)
endif()

またはFortranで置き換えることができる場所。CXXC

この場合、変数CMAKE_<language>_FLAGS_<build type>に基づいてフラグが設定されCMAKE_BUILD_TYPEます。に設定されている場合はRelease、 を使用しますCMAKE_Fortran_FLAGS_RELEASE。他にもいくつかの可能なビルド タイプを追加しました。ユーザーが標準のビルド タイプではないものが必要な場合はCMAKE_<language>_FLAGS、構成時に必要なものを設定し、ビルド タイプの設定をオーバーライドして、代わりにユーザー定義のフラグを使用します。

于 2012-04-14T01:25:21.260 に答える
1

問題を解決するために利用するより良い方法はほぼ確実にcmakeありますが、質問のこの部分は簡単に対処できます。

しかし、CMakeLists.txt ファイルに実際の変更を加えた場合、コンパイル フラグの個人的な選択を押し上げるのを避ける方法はありません。

これは、特定の個人的なファイルの変更をローカル リポジトリにコミットする場合にのみ当てはまります。それでもgit-revert、パッチを作成してプッシュするかdevelopmentready-to-push-to-other-developersブランチ間でフィルターを使用することができます。大まかなアイデアはここにありますが、質問の例から問題のある個人的な行を削除するには、かなり大幅に編集する必要があります。

したがって、より良いオプションは、個人的な変更をコミットしないことです。ここの回答から、特定の変更をファイルに簡単にコミットできます。

ただし、無視されていないファイルにコミットされていない変更があると、作業ツリーが永久に汚れてしまうことに注意してください。マージなどのワークフローによっては、これが問題になる場合とそうでない場合があります。

于 2012-04-14T13:28:35.263 に答える