使用cmake或cpack编辑.bat

时间:2018-02-08 13:11:41

标签: windows batch-file cmake environment-variables add-custom-command

我使用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,即使它在添加到env路径的文件夹中也不起作用。 我尝试使用configure_file,但在配置步骤中很快执行,因此在用户使用cpack安装程序选择“HardPATH”之前。也许使用add_custom_command可以做些什么?但我不知道如何使用此命令更改.bat中的hardPATH,或者是否可能。

知道如何解决这个“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% 我看到我选择在其中安装mysoftware的地方。

  

C:\ Program Files \ NVIDIA GPU Computing Toolkit \ CUDA \ v9.0 \ bin; C:\ Program Files \ NVIDIA GPU Computing Toolkit \ CUDA \ v9。   0 \ libnvvp; C:\ Python36 \脚本\; C:\ Python36 \; C:\ Windows \ System32下; C:\视窗; 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 \米   ingw64 \ bin; C:\ Program Files \ Git \ usr \ bin; C:\ Users \ xxx \ Desktop \ testCode \ bin ;; C:\ Users \ xxxx \ AppData \ Local \ GitHubDesktop \仓; d:\ XXXX \泊坞   工具箱

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

1 个答案:

答案 0 :(得分: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文件。

请注意,这仍然是坏主意。惯例是安装树中的文件是可重定位的,因此在安装工件中的任何位置都有硬编码的绝对路径并不是一件好事,并且可能会让用户感到不安。更好地更改脚本,使它们只能使用相对路径。