只在cmake中运行C预处理器?

ars*_*enm 14 cmake opencl c-preprocessor

我正在尝试使用cmake来简化我的OpenCL程序的分发.我有一个内核文件,其中包含几个头文件和其他源文件,我希望有一个自包含的可执行文件.

我的计划是让cmake 在内核源代码上运行C预处理器,将cl文件及其包含文件转换为一个更易于使用的单元.

我可以使用add_custom_command通过使用-E调用gcc/clang来实现它,但是我没有得到包含正确目录的标志来查找命令中的各种头文件,我看不到一个简单的方法查找在编译器的自定义调用中使用的所有当前包含目录.

有没有办法在具有当前cmake环境的文件上只运行C预处理器?

Tad*_*ski 15

CMake自动为预处理文件生成make目标.对于foo.c项目中的每个项目,都有一个foo.imake目标,它只运行预处理器(包含所有相关-D-I标志等).运行make help以查看CMake在makefile中生成的所有其他可能有用的目标.

顺便说一句,我看不出这个"单一单元"如何更容易为你工作.

  • 此外,并非所有可以与CMake一起使用的生成器都会生成.i目标 - 忍者生成器不会生成.i目标. (3认同)
  • 这个答案是大多数人都会寻找的答案,即使它没有准确回答OP的问题. (2认同)
  • 值得注意的是,对于复杂的 CMake 项目,您感兴趣的文件的“.i”目标可能位于嵌套 Makefile 之一中 - 首先是“CMakeFiles/Makefile2”,然后对于子项目,它会调用像“build.make”这样的东西深深地埋在库的路径中 (2认同)

kli*_*kin 5

到目前为止这工作正常:

function(add_c_preprocessor_command)
    # Add custom command to run C preprocessor.
    #
    # Arguments
    #   OUTPUT          output file
    #   SOURCE          input file
    #   TARGET          CMake target to inherit compile definitions, include directories, and compile options
    #   EXTRA_C_FLAGS   extra compiler flags added after all flags inherited from the TARGET

    set(one_value_args TARGET SOURCE OUTPUT)
    set(multi_value_args EXTRA_C_FLAGS)
    cmake_parse_arguments(CPP "" "${one_value_args}" "${multi_value_args}" ${ARGN})

    string(TOUPPER ${CMAKE_BUILD_TYPE} build_type)
    string(REPLACE " " ";" c_flags "${CMAKE_C_FLAGS} ${CMAKE_C_FLAGS_${build_type}}")

    add_custom_command(
        OUTPUT ${CPP_OUTPUT}
        COMMAND ${CMAKE_C_COMPILER}
            "-D$<JOIN:$<TARGET_PROPERTY:${CPP_TARGET},COMPILE_DEFINITIONS>,;-D>"
            "-I$<JOIN:$<TARGET_PROPERTY:${CPP_TARGET},INCLUDE_DIRECTORIES>,;-I>"
            ${c_flags}
            $<TARGET_PROPERTY:${CPP_TARGET},COMPILE_OPTIONS>
            ${CPP_EXTRA_C_FLAGS}
            -E ${CPP_SOURCE} -o ${CPP_OUTPUT}
        COMMAND_EXPAND_LISTS VERBATIM
        IMPLICIT_DEPENDS C ${CPP_SOURCE}
        DEPENDS ${CPP_SOURCE})
endfunction()
Run Code Online (Sandbox Code Playgroud)


tau*_*ran 0

我建议采用不同的方法。

  1. 将内核构建为二进制文件(ATI Stream 示例:http://developer.amd.com/support/KnowledgeBase/Lists/KnowledgeBase/DispForm.aspx ?ID=115 )

  2. 将此二进制数据编译到您的程序中(作为 char[] blob)并在程序启动时加载它。

使用 cmake 和自定义目标,这应该非常简单。