使用 cmake 或 cpack 编辑 .bat

Posted

技术标签:

【中文标题】使用 cmake 或 cpack 编辑 .bat【英文标题】:edit .bat using cmake or cpack 【发布时间】:2018-02-08 13:11:41 【问题描述】:

我使用 cmake 和 cpack 为我的软件制作了安装程序。 在 cpack 安装程序中,用户选择安装软件的位置。 比如说C:\Users\MySoftware

我的所有.exepython 文件都使用cmake 的目标选项进入其中。 使用cpack,它将C:\Users\MySoftware 添加到我的环境变量中。 那么我所有的 .exe 都可以从窗口 cmd 使用。

我有一个.bat,它以某种顺序运行多个.exe,并带有一些选项等... 在它的中间,它运行一个python脚本。

python C:\HardPATH/mypython.py -i %var1% -m %var2% -t %var3% -o %var4% -I %var5% . 

我正在尝试在使用 cmake 或 cpack 时修改 C:\HardPath

我的问题是,我找不到根据用户选择安装软件的位置使用cmakecpack 编辑“HardPATH”的方法。 并且因为它是.py 而不是.exe,所以即使它位于添加到环境路径的文件夹中,它也不起作用。 我尝试使用configure_file,但它很快就会在配置步骤中执行,因此在用户使用 cpack 安装程序选择“HardPATH”之前。也许使用add_custom_command 有可能?但我不知道如何使用此命令更改 .bat 中的硬路径,或者如果可能的话。

知道如何解决这个“HardPATH”问题吗?

  IF(CMAKE_SYSTEM_NAME STREQUAL Windows)
    IF(Pack)
     INSTALL(TARGETS 
            exe1
            exe2
            etc
            DESTINATION bin)

     find_program(PYTHON "python")

    if (PYTHON)
     INSTALL(FILES mypython.py DESTINATION bin)
    endif()

   ELSE(Pack)
    INSTALL(TARGETS 
            exe1
            exe2
            etc
            DESTINATION $CMAKE_INSTALL_PREFIX/bin)

    find_program(PYTHON "python")
    if (PYTHON)
      INSTALL(FILES mypython.py DESTINATION $CMAKE_INSTALL_PREFIX/bin)
    endif()
  ENDIF(Pack)

  ENDIF(CMAKE_SYSTEM_NAME STREQUAL Windows)

并在 env 变量中添加路径,在调用这个的主 cmakelist 中,我有:

set(CPACK_PACKAGE_NAME "CPackExampleInstaller")
SET(CPACK_NSIS_MODIFY_PATH ON)
INCLUDE(CPack)

如果我输入echo %PATH% 我看到了我选择在其中安装我的软件的位置。

C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9.0\bin;C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v9. 0\libnvvp;C:\Python36\Scripts\;C:\Python36\;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1. 0\;C:\临 gram Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;C:\Program Files (x86)\Microsoft SDKs\TypeScript\1.0\;C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\Program Files\CMake\bin;C:\Program Files\Git\cmd;C:\Program Files\Git \m ingw64\bin;C:\Program Files\Git\usr\bin;C:\Users\xxx\Desktop\testCode\bin;;C:\Users\xxxx\AppData\Local\GitHubDesktop\ bin;D:\xxxx\Docker 工具箱

我可以在 C:\Users\xxx\Desktop\testCode\bin 中调用 .exe,而无需输入完整路径。但不是蟒蛇

【问题讨论】:

你把.bat文件的代码贴出来怎么样,或许我能清楚你想要什么。 对不起,我认为它已经足够清楚了。 python C:\HardPATH/mypython.py -i %var1% -m %var2% -t %var3% -o %var4% -I %var5% 。我在使用 cmake 或 cpack 时尝试修改 C:\HardPath 然后将路径作为变量发送并使用%1 捕获它,但我无法向您展示,因为我没有您的任何代码。另外,不要向 cmets 添加代码,而是编辑您的问题并将其添加到那里。 我不明白你的意思。你想要哪个代码? cmakelists.txt ? .bat 文件?我不明白 是的,您需要代码方面的帮助,所以发布一些代码。 【参考方案1】:

使用configure_file

您的源代码树只包含最终文件的模板,而不是带有硬编码路径的最终 .bat

rem File: foo.bat.in
python @MY_PATH@/mypython.py -i %var1% -m %var2% -t %var3% -o %var4% -I %var5% . 

然后您使用 CMake 将真正的批处理文件生成到二叉树中:

set(MY_PATH $CMAKE_INSTALL_PREFIX/python)
configure_file($PROJECT_SOURCE_DIR/foo.bat.in $PROJECT_BINARY_DIR/foo.bat @ONLY)

然后从二叉树安装.bat 文件。

请注意,这仍然是一个坏主意。约定是安装树中的文件是可重定位的,因此在安装工件的任何位置硬编码绝对路径并不是一件好事,而且可能会让您的用户感到不安。最好更改您的脚本,使其仅适用于相对路径。

【讨论】:

谢谢。这就是我要找的。我将很快尝试(暂时无法访问我的计算机)。我只是担心非相对路径,我在 cpack 和这个方面遇到了一些问题,但我很快就会尝试 所以我已经这样做了: set(MY_PATH $CPACK_PACKAGE_DIRECTORY/bin) configure_file(Test.bat.in $CPACK_PACKAGE_DIRECTORY/bin/Test.bat @ONLY) 但它不起作用。 .bat 没有出现在用户使用 cpack 界面选择的目录中 您需要两个步骤,如上所述:您配置到构建树并安装到安装树。不要试图通过混合两者来偷工减料。 我不明白你的意思。在我的源代码中,我有 .bat.in 在其中设置 python @MY_PATH@/mypython.py 等...我希望 MY_PATH 成为用户使用 cpack install 指定的路径。这个变量是 $CPACK_PACKAGE_DIRECTORY 对吗?我希望这个 .bat 进入路径指示的目录。所以你说的是我应该这样做: set(MY_PATH $CPACK_PACKAGE_DIRECTORY/bin) configure_file(Test.bat.in $CMAKE_BINARY_DIR/Test.bat @ONLY),然后 INSTALL(FILES Test.bat DESTINATION bin) ?我现在正在尝试没有成功 在执行 cmake 配置和生成后,我在 build 目录中有 python $CPACK_PACKAGE_DIRECTORY/mypython.py。当我生成 cpack 安装程序并安装它时,不要将 .bat 移动到我想要的位置

以上是关于使用 cmake 或 cpack 编辑 .bat的主要内容,如果未能解决你的问题,请参考以下文章

CPack / CMake:每个 CPACK_GENERATOR 的不同安装前缀

InstallDirRegKey 的 CMake/CPack 命令

如何使用 cpack/cmake 生成具有特定文件组织的 nuget 包?

CMake + CPack:安装整个目录(包括子文件夹)

使用 CMake 和 CPack 为一个组件创建包

CMake 和 CPack。配置文件中的安装路径