CMake execute_process命令如何运行?

时间:2016-10-11 19:07:40

标签: shell cmake environment

我的CMakeLists.txt文件中有以下几行。我在Windows 7上运行CMake 3.5.2,并使用Visual Studio 12 2013作为生成器,在gui中选中了“使用默认本机编译器”。

    <?php

    if ($post->post_parent) {
        $ancestors=get_post_ancestors($post->ID);
        $root=count($ancestors)-1;
        $parent = $ancestors[$root];
    } else {
        $parent = $post->ID;
    }

    $sibblings = wp_list_pages("title_li=&child_of=". $parent ."&echo=0");

    $children = wp_list_pages( array(
        'title_li' => '',
        'child_of' => $post->ID,
        'echo'     => 0,
        'sort_column' => 'menu_order, post_title'
    ) );

    ?>

    <?php if ($sibblings) { ?>
    <ul class="page-nav hidden-sm hidden-xs">
        <?php echo $sibblings; ?>
    </ul>
<?php } else {?>
    <ul class="page-nav hidden-sm hidden-xs">
        <?php echo $sibblings; ?>
    </ul>
    <ul class="page-nav-children hidden-sm hidden-xs">
        <?php echo $children; ?>
    </ul>

<?php } ?>

这样运行得很好。

但它到底是怎么运行的?它在Windows上!

之前我在Windows上通过MSYS2(MinGW)编译了Makefile,但如果那是CMake正在使用的,那么我不知道它是如何做到的。

修改:我将find_path(FORTRAN_DIR NAMES cdll.cpp fdll.f90 Makefile PATHS ../source) execute_process(COMMAND make WORKING_DIRECTORY ${FORTRAN_DIR}) 放入CMakeLists.txt文件并获得execute_process(COMMAND uname -a)。所以我猜这是通过MSYS运行的答案......但CMake如何知道这样做?

The documentation说:

“CMake直接使用操作系统API执行子进程。所有参数都通过VERBATIM传递给子进程。没有使用中间shell,所以shell操作符如&gt;被视为普通参数。”

但是我不明白这意味着什么,特别是考虑到如果我使用以下行,我得到MSYS_NT-6.1 MYCOMPUTERNAMEHERE 2.5.2(0.297/5/3) 2016-07-15 08:31 x86_64 Msys作为输出:

/usr/bin/make

发生了什么,和/或我怎样才能找出环境/ shell /运行这些命令的内容?

1 个答案:

答案 0 :(得分:2)

CMake附带了Kitware的OS抽象/检测库kwsys

  

KWSys为许多常见系统提供了独立于平台的API   在每个平台上以不同方式实现的功能。

execute_process()使用CreateProcessW()ProcessWin32.c execvp()使用MinGW进行MSYS魔术,具体取决于您使用的是哪个版本的CMake。

所以 - 正如@Tsyvarev所评论的那样 - 你的行为可能是PATH环境中带有MSYS / function fa = mymotor(theta) %this matlab file will generate back emf of phase a %function [fa]= mymotor(theta) %inputs: theta -- rotor position in rad %output: fa -- function of rotor position of phase a pi=3.14159; theta=0<theta<2*pi; if(0<theta<pi/6) fa=(6/pi)*theta; elseif(pi/6<theta<5*pi/6) fa=1; elseif(5*pi/6<theta<7*pi/6) fa=-(6/pi)*theta + 6; elseif(7*pi/6<theta<11*pi/6) fa=-1; else fa=(6/pi)*theta - 12; end 的CMake的Win32 / 64版本(找到给定的Unix特定命令) )或者MinGW32 / 64版本的CMake从function fb = mymotor(theta) %this matlab file will generate back emf of phase b %function [fb]= mymotor(theta, E) %inputs: theta -- rotor position in rad %output: eb -- function of rotor position of phase b pi=3.14159; theta=0<theta<2*pi; if(0<theta<pi/2) fb=-1; elseif(pi/2<theta<5*pi/6) fb=(6/pi)*theta - 4; elseif(5*pi/6<theta<9*pi/6) fb=1; elseif(9*pi/6<theta<11*pi/6) fb=-(6/pi)*theta + 10; else fb=1; end 运行。

此外,您可以考虑使用类似ProcessUNIX.c之类的东西来获取相关Unix工具的绝对路径。

<强>参考