CMake找不到自定义命令“ls”

时间:2016-08-19 18:57:03

标签: windows cmake

我尝试为我的CLion项目运行一些基本命令,但它不起作用。这是我的CMake设置。

cmake_minimum_required(VERSION 3.6)
project(hello)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

set(SOURCE_FILES main.cpp)
add_executable(hello ${SOURCE_FILES})

add_custom_command(OUTPUT hello.out
        COMMAND ls -l hello
        DEPENDS hello)

add_custom_target(run_hello_out
        DEPENDS hello.out)

在CLion中运行run_hello_out时收到以下错误消息。

[100%] Generating hello.out
process_begin: CreateProcess(NULL, ls -l hello, ...) failed.
make (e=2): The system cannot find the file specified.
mingw32-make.exe[3]: *** [hello.out] Error 2
mingw32-make.exe[2]: *** [CMakeFiles/run_hello_out.dir/all] Error 2
mingw32-make.exe[1]: *** [CMakeFiles/run_hello_out.dir/rule] Error 2
mingw32-make.exe: *** [run_hello_out] Error 2
CMakeFiles\run_hello_out.dir\build.make:59: recipe for target 'hello.out' failed
CMakeFiles\Makefile2:66: recipe for target 'CMakeFiles/run_hello_out.dir/all' failed
CMakeFiles\Makefile2:73: recipe for target 'CMakeFiles/run_hello_out.dir/rule' failed
Makefile:117: recipe for target 'run_hello_out' failed

应该运行“ls -l hello”并在构建窗口或运行窗口中查看结果。

2 个答案:

答案 0 :(得分:1)

即使我正确地设置了全局路径,ls也不起作用。 CMake需要完整的路径。以下工作并解决了这个问题。

add_custom_command(OUTPUT hello.out
        COMMAND "C:\\FULL PATH HERE\\ls" -l hello
        DEPENDS hello)

答案 1 :(得分:1)

问题

CMake并不保证其COMMAND来电的shell上下文,也不会自动搜索COMMAND本身提供的可执行文件。

它主要将给定的命令放入生成的构建环境中,并取决于它在那里的处理方式。

在您的情况下,我假设您/ CLion在MS Windows cmake shell中运行mingw32-makecmd。在这种情况下,您必须使用dir而不是ls命令:

add_custom_target(
    run_hello_out
    COMMAND dir $<TARGET_FILE_NAME:hello>
    DEPENDS hello
)

可能的解决方案

我看到三种可能的解决方案。

  1. 提供bash shell上下文

    include(FindUnixCommands)
    
    if (BASH)
        add_custom_target(
            run_hello_out
            COMMAND ${BASH} -c "ls -l hello"
            DEPENDS hello
        )
    endif()
    
  2. 使用CMake的shell抽象cmake -E(只有有限数量的命令,例如没有ls等效命令)

    add_custom_target(
        run_hello_out
        COMMAND ${CMAKE_COMMAND} -E echo $<TARGET_FILE:hello>
        DEPENDS hello
    )
    
  3. 使用find_program()搜索可执行文件。

    find_program(LS ls)
    
    if (LS)
        add_custom_target(
            run_hello_out
            COMMAND ${LS} -l hello
            DEPENDS hello
    endif()
    
  4. <强>参考