web-dev-qa-db-ja.com

CMakeとVisual Studioを使用してパス環境変数を設定し、テストを実行する方法

CMakeを使用してVisual Studioプロジェクトファイルを生成しています。必要なdllをロードできるように、PATH環境変数を設定した後、テスト実行可能ファイルを実行したいと思います。 http://www.mail-archive.com/[email protected]/msg21493.html での議論に従って試しましたが、機能しません。

この目的でVisual StudioでCMakeを使用しましたか?あなたの経験を共有してください。

また、CMakeスクリプトをデバッグする簡単な方法はありません。たとえば、PATH変数にどの値を割り当てるかを確認します。 CMakeの詳細をCMAKE_VERBOSE_MAKEFILEで設定しても効果はありません。自分でデバッグするにはどうすればよいですか?

43
amit

CMakeからVisual Studioでカスタムプロジェクト設定を設定するには、XMLファイルをテンプレートとして使用し、CMakeから.userファイルとして機能するように構成できます。
私の仕事では、これを使用してカスタムデバッグパラメーターを設定します。

生成された.vcxprojファイルを含むディレクトリで、.userファイルのユーザー設定を確認します。以下は、使用するUserTemplate.vcxproj.userファイルの例のスニペットです。

    <?xml version="1.0" encoding="Windows-1252"?>
      <VisualStudioUserFile
        ProjectType="Visual C++"
        Version="9.00"
        ShowAllFiles="false"
        >
        <Configurations>
            <Configuration
                Name="Debug|@USERFILE_PLATFORM@"
                >
                <DebugSettings
                    Command="@USERFILE_COMMAND_DEBUG@"
                    WorkingDirectory="@USERFILE_WORKING_DIRECTORY_DEBUG@"
                    CommandArguments="@USERFILE_COMMAND_ARGUMENTS_DEBUG@"
                    Attach="false"
                    DebuggerType="3"
                    Remote="1"
                    RemoteMachine="@USERFILE_REMOTE_MACHINE_DEBUG@"
                                <!-- More settings removed for snippet -->
                />
            </Configuration>
                <!-- Rest of Configurations -->

PATH変数を設定するUserTemplate.vcxproj.userの別の例は、次のようになります。

    <?xml version="1.0" encoding="utf-8"?>
    <Project ToolsVersion="15.0" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
      <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
        <LocalDebuggerEnvironment>PATH=..\Your_path;%PATH%".</LocalDebuggerEnvironment>
        <DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
      </PropertyGroup>
    </Project>

UserTemplate.vcxproj.userファイルをCMakeLists.txtファイルの隣に設定すると、必要な変数をCMakeからビルド済みプロジェクトの.vcxproj.userファイルに挿入できます。 CMakeでは、適切なCMake変数を設定できます(必要に応じて、テンプレートファイルに変数を追加します)。次に、このようなことを行ってファイルを構成できます。

    # Find user and system name
    SET(SYSTEM_NAME $ENV{USERDOMAIN} CACHE STRING SystemName)
    SET(USER_NAME $ENV{USERNAME} CACHE STRING UserName)

    # Configure the template file
    SET(USER_FILE ${_projectName}.vcxproj.${SYSTEM_NAME}.${USER_NAME}.user)
    SET(OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/${USER_FILE})
    CONFIGURE_FILE(UserTemplate.vcxproj.user${USER_FILE} @ONLY)

システムとユーザー名を気にしない場合は、次の設定で十分です。

    # Configure the template file
    SET(USER_FILE ${_projectName}.vcxproj.user)
    SET(OUTPUT_PATH ${CMAKE_CURRENT_BINARY_DIR}/${USER_FILE})
    CONFIGURE_FILE(UserTemplate.vcxproj.user ${USER_FILE} @ONLY)
42
pkit

今この質問を見つけました。使用するcmakeファイルをデバッグするには

MESSAGE( STATUS "static text ${variable}" )

テストを実行するためのパスを設定する必要がありませんでした。 CTestを使用していますか?あなたがフォローしているリンクがctestで使用されているようです。

これを機能させようとした場合、set_tests_properties最初に明示的に。

set_tests_properties(SomeTest PROPERTIES ENVIRONMENT "PATH=c:\somedir;c:\otherdir")

次に、より一般的にします。

10
iain

関連するCMake機能リクエストレポートは次のとおりです。

http://www.kwwidgets.org/Bug/view.php?id=8884

更新:解決方法 CMakeを使用してVisual Studioプロジェクトの「カスタム環境変数」設定を設定 -以下のコメントを付けてくれたFlorianに感謝します。

5
mloskot

新しい VS_USER_PROPS ターゲットプロパティ(バージョン> = 3.8)。

これが実際の例です:

CMakeLists.txt

cmake_minimum_required(VERSION 3.0)

project(SetEnvPathTest)

file(WRITE main.cpp [=[
// http://en.cppreference.com/w/cpp/utility/program/getenv
#include <iostream>
#include <cstdlib>

int main()
{
    if(const char* env_p = std::getenv("PATH"))
        std::cout << "Your PATH is: " << env_p << '\n';
}
]=])
add_executable(${PROJECT_NAME} main.cpp)

file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}.Cpp.user.props" [=[
<?xml version="1.0" encoding="utf-8"?> 
<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.Microsoft.com/developer/msbuild/2003">
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
    <LocalDebuggerEnvironment>PATH=C:\Test</LocalDebuggerEnvironment>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
    <LocalDebuggerEnvironment>PATH=C:\Test</LocalDebuggerEnvironment>
  </PropertyGroup>
</Project>
]=])

set_target_properties(
    ${PROJECT_NAME}
    PROPERTIES
        VS_USER_PROPS "${PROJECT_NAME}.Cpp.user.props"
) 

参考文献

4
Florian

Cmakeには、カスタムPATHを設定するために使用できるVS_DEBUGGER_ENVIRONMENTプロパティがあります

https://cmake.org/cmake/help/v3.13/prop_tgt/VS_DEBUGGER_ENVIRONMENT.html

set(MY_PATH "PATH=%PATH%" ${MY_CUSTOM_PATH})
set_target_properties(MyTarget PROPERTIES VS_DEBUGGER_ENVIRONMENT "{MY_PATH}")

その他の便利なプロパティには、VS_DEBUGGER_COMMAND_ARGUMENTS、VS_DEBUGGER_WORKING_DIRECTORYなどがあります。

2
Vishwesh

このリンクでは、1つだけではなく(たとえば、PATHのみ)複数の環境変数を設定できる非常に便利な追加機能が提供されていることを指摘したかっただけです https://stackoverflow.com/a/40531167/925311

たとえば、PATHの設定に加えて、別の変数OTHERVARを設定したい場合、次の行を変更する必要があります。

<LocalDebuggerEnvironment>PATH=C:\Test</LocalDebuggerEnvironment>

<LocalDebuggerEnvironment>PATH=C:\Test &#xA;OTHERVAR="value of OTHERVAR"</LocalDebuggerEnvironment>

記号「&#xA;」は、LF文字を導入するようにxmlパーサーに指示します。したがって、LF文字で区切られている場合、複数の変数定義が可能です(CR文字も機能しますが、CRLFの組み合わせは機能しません)

また、&#xA;と次の変数の間にはスペースを入れられないことに注意してください。

1