4

私はCMakeを使用して、プロジェクトのビルドスクリプト(Makefiles + VSソリューション)を作成しています。ベストプラクティスとして、ビルドスクリプトを別のフォルダー(ソース外)に作成します。同じフォルダーにプロジェクトをビルドします。

buildこれはコンパイルされたプログラムでは問題なく機能しますが、Pythonスクリプトにはビルドフォルダーにコピー()するビルドステップがないため、Pythonスクリプトの適切なソリューションを見つけることができません。

創造的な解決策を探しています...

要件:

  • すべての実行可能ファイルは、ビルド後のビルドフォルダーで利用できる必要があります(*.pyファイルは実行可能であると考えています)
  • Pythonスクリプトは、IDE(スパイダー、日食など)を使用して簡単に管理する必要があります
  • Pythonスクリプトを含むソースフォルダーはGitリポジトリにあります。ビルドフォルダはそうではありません。
  • C ++でコンパイルされたPythonモジュールは、関連するPythonスクリプトの隣に配置する必要があります

これまでのところ、2つのオプションを検討しました。

  • CMakeの実行時にスクリプトをビルドフォルダーにコピーする-Pythonファイルを変更するたびにCMakeを実行する必要があります(IDEに対応していません)。混乱を引き起こす可能性があります:編集するソースのコピーはどれですか?
  • ビルドフォルダにソースフォルダへのリンクを作成します-マルチプラットフォームの混乱。ソースフォルダを汚染せずに、スクリプトの横にコンパイル済みのc++pythonモジュールをデプロイする際の問題。

これが十分に明確であることを願っています。

4

2 に答える 2

3

最終的に、コンパイルされていないがビルド環境で必要なPythonソースやその他の関連ファイルへのシンボリックリンクを作成するソリューションを見つけました。ビルドされたモジュールとシンボリックリンクを混在させるために、シンボリックリンクの代わりに実際のフォルダーを使用しました。

こちらです:

  • Pythonスクリプトのコピーが1つあります
  • バイナリフォルダからシームレスに実行/編集できます

効用関数:

function (create_symlinks)
    # Do nothing if building in-source
    if (${CMAKE_CURRENT_BINARY_DIR} STREQUAL ${CMAKE_CURRENT_SOURCE_DIR})
        return()
    endif()

    foreach (path_file ${ARGN})
        get_filename_component(folder ${path_file} PATH)

        # Create REAL folder
        file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/${folder}")

        # Delete symlink if it exists
        file(REMOVE "${CMAKE_CURRENT_BINARY_DIR}/${path_file}")

        # Get OS dependent path to use in `execute_process`
        file(TO_NATIVE_PATH "${CMAKE_CURRENT_BINARY_DIR}/${path_file}" link)
        file(TO_NATIVE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${path_file}" target)

        if (UNIX)
            set(command ln -s ${target} ${link})
        else()
            set(command cmd.exe /c mklink ${link} ${target})
        endif()

        execute_process(COMMAND ${command} 
                        RESULT_VARIABLE result
                        ERROR_VARIABLE output)

        if (NOT ${result} EQUAL 0)
            message(FATAL_ERROR "Could not create symbolic link for: ${target} --> ${output}")
        endif()

    endforeach(path_file)
endfunction(create_symlinks)

Pythonモジュール(CMakeLists.txt内)の使用法:

# Do not omit !!!RELATIVE!!!
file(GLOB_RECURSE files RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *.py *.dat *.xml)
create_symlinks(${files})

使用法:

cd src_dir
mkdir build_dir
cd build_dir
cmake ..

重要:

  • 新しいファイルを追加するときは、実行することを忘れないでくださいcmake
  • Windowsでは、一部のWindowsバージョンmklinkのみをサポートします
  • Windowsではmklink、管理者としてのみ実行できます。回避策はここにあります。
  • 呼び出すときは相対パスを使用create_symlinksします。これは、ディレクトリ構造がバイナリフォルダで再構築される方法です。
于 2012-12-24T08:31:09.740 に答える
0

この投稿に示されているように、カスタムコマンドを作成して、Pythonスクリプトをビルドフォルダーにコンパイルします。

于 2012-12-20T23:55:18.360 に答える