- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用CMake构建自定义项目,这涉及使用emscripten为我的C++库提供javascript绑定(bind)。
这就是我想要实现的CMakeLists.txt文件
interface/glue.cpp
interface/glue_wrapper.cpp
f
中的每个头文件${my_header_files}
,将#include "f"
附加到文件interface/glue_wrapper.cpp
interface/glue_wrapper.cpp
中的最终条目应为#include "glue.cpp"
interface/glue_wrapper.cpp
${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS} ${ALL_SOURCES} interface/glue_wrapper.cpp --post-js glue.js -o output.js
# Build Interface
ADD_CUSTOM_COMMAND(
OUTPUT interface/glue.cpp
COMMAND cd interface
COMMAND python ${PLATFORM_PREFIX}/tools/webidl_binder.py ${myclasses_INTERFACE} glue
# Need to loop through list and generate include statements ...
#COMMAND echo "#include <glue.cpp>" > glue_wrapper.cpp
)
# Build JS library
ADD_CUSTOM_COMMAND(
OUTPUT ${PROJECT_JS_DIR}/${PROJECT}.js
COMMAND ${CMAKE_CXX_COMPILER} # Nothing seems to work anyway .... giving up finally :(
)
最佳答案
看来glue_wrapper.cpp
的内容根本不依赖于构建时值,它们纯粹基于CMake时可用的信息(my_header_files
变量的内容)。因此,您可以使用简单的file()
命令在CMake时创建文件:
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/interface/glue_wrapper.cpp) # erase file if it exists
foreach(header IN LISTS my_header_files ITEMS glue.cpp)
file(APPEND ${CMAKE_CURRENT_BINARY_DIR}/interface/glue_wrapper.cpp "#include \"${header}\"\n")
endforeach()
add_custom_command(
OUTPUT ${PROJECT_JS_DIR}/${PROJECT}.js
COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS} ${ALL_SOURCES} interface/glue_wrapper.cpp --post-js glue.js -o output.js
DEPENDS ${ALL_SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/interface/glue_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/interface/glue.cpp
COMMENT "Building ${PROJECT}.js"
VERBATIM
)
add_custom_target(
JsLibrary ALL
DEPENDS ${PROJECT_JS_DIR}/${PROJECT}.js
COMMENT "Building JsLibrary"
)
add_custom_command
具有
WORKING_DIRECTORY
参数,您应该使用该参数代替
COMMAND cd
。
add_custom_command(OUTPUT x ...)
创建一个生成规则,该规则生成一个输出。基本上,这告诉CMake:
x
文件,请按以下步骤创建它。
add_custom_command(
OUTPUT ${PROJECT_JS_DIR}/${PROJECT}.js
COMMAND ${CMAKE_CXX_COMPILER} ${CMAKE_CXX_FLAGS} ${ALL_SOURCES} interface/glue_wrapper.cpp --post-js glue.js -o output.js
COMMAND
参数介绍要执行的命令的命令行。它说:“这是产生
OUTPUT
中列出的文件所必须要做的。”
DEPENDS ${ALL_SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/interface/glue_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/interface/glue.cpp
DEPENDS
部分介绍命令的依赖关系(先决条件)。紧随其后的每个项目都是一个文件,该文件是命令的依赖项。它说:“如果缺少这些文件中的任何一个,或者如果这些文件中的任何一个比输出文件中的任何新,则必须重新运行此命令。”
${CMAKE_CURRENT_BINARY_DIR}/interface/glue.cpp
的依赖,我将在稍后再讨论。
COMMENT "Building ${PROJECT}.js"
VERBATIM
)
COMMAND
节中的任何特殊字符。基本上,除非您确实有理由不这么做,否则始终将其放入自定义命令中。
DEPENDS
节中列出另一个自定义命令的输出,从而创建所需的依赖关系。但是,只有在某处请求“master”命令的输出时,这两者才会再次包括在内。
add_custom_target(
JsLibrary
JsLibrary
只是目标的符号名称。可以是您想要的任何东西。您将在命令行上键入该名称以构建
.js
文件:
> make JsLibrary
。
ALL
all
调用的
make all
目标的一部分;您必须对它们进行
make
明确编码。添加
ALL
参数将成为
make all
的自定义目标部分,我假设您会在此处使用。
DEPENDS ${PROJECT_JS_DIR}/${PROJECT}.js
JsLibrary
),并查看它是否知道如何创建这样的文件。它找到定制命令,并确保将适当的规则添加到生成的构建系统中。
COMMENT "Building JsLibrary"
)
JsLibrary
将包含在构建系统中,因为它是一个自定义目标,并且始终包含自定义目标。这将是
make all
的一部分,因为我们在创建时指定了
ALL
。
JsLibrary
取决于
${PROJECT_JS_DIR}/${PROJECT}.js
,因此由custom命令创建的规则将包含在构建系统中,并在每次构建
JsLibrary
时进行检查。如果过时,它将被执行。
${PROJECT_JS_DIR}/${PROJECT}.js
依次取决于
${CMAKE_CURRENT_BINARY_DIR}/interface/glue.cpp
,因为这是在创建
DEPENDS
的自定义命令的
.js
部分中指定的。因此,在创建
glue.cpp
的自定义命令中描述的规则也将包含在构建系统中,并且一切正常。
关于build - CMake自定义构建问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30112274/
运行 pip install cmake 时出现上述错误在 alpine linux (WSL) 上。 完整错误: /home/user# pip install cmake Collecting c
我的项目依赖 mariadb-connector-c我正在尝试使用 cmake 自动化下载、构建和链接过程。 我目前将项目下载到一个目录中,然后尝试执行生成忍者文件并运行它们,但我根本无法运行 cma
我正在尝试像这样在 cmake 中执行 execute_process execute_process(COMMAND ${CMAKE_COMMAND} -P myScript.cmake 这仅在文件
我想知道如果我没有给它任何变量告诉它在哪里找到它,cmake 如何找到我的 llvm cmake 配置。 我是 LLVM 新手。我正在构建一个 Hello World LLVM pass。我在 Ubu
我正在开发一个使用 CMake 的项目。顶CMakeLists.txt文件包含以下行: cmake_minimum_required(VERSION 3.7.2) # Kittens will die
我正在使用 Meego 1.2 工具链使用 cmake 运行构建(长话短说)。这个特定的工具链需要使用 --sysroot 选项来查找它需要的任何库。 set (CMAKE_CXX_FLAGS "-f
我们有一些源代码处理工具,可以从多个“片段”生成原始汇编文件等内容。 当使用 make 中的这些工具时,我们可以通过让源处理工具发出“依赖文件”来确保最新的构建,就像 gcc 一样-MD 标志。 例如
如何在 MSYS2 中安装和配置“cmake”?我尝试安装以下 MSYS 包 我在运行任何 cmake 命令时都收到以下错误 '''CMakeLists.txt:5 (cmake_minimum_re
有没有办法在 CMake 中得到一个变量列表?具体来说,我想要做的是调用一个现有函数,该函数接受多个变量并检查它们的计算结果是否为 true。 在某些情况下,其中一些变量将是空列表(计算结果为 fal
我有两组测试(功能测试和单元测试),我希望能够指定通过 cmake 运行哪一组。 一组测试是我想通过“make test”运行的单元测试。 另一组测试是我想通过“制作功能测试”来运行的功能测试。 目前
我的目标是查看有关调用 g++ 的详细信息由 cmake 直接调用从命令行。我不关心 make 的输出就这个问题而言。 根据official FAQ和 the accepted answer on a
我有一个生成库的CMake项目。我已经编写了一个CMake脚本FindXXX.cmake来帮助我的图书馆的用户。这样,他们可以使用find_package(XXX)并获取所需的变量。到现在为止还挺好。
当我看到带有命名空间的 CMake 库时,它们总是在表单中Parent::Component . 如果我有一个足够大的库,那么该库的子部分可能包含组件。我想知道是否可以/适合做 ParentProje
CMake 变量和属性似乎完成了非常相似的事情,我一直无法理解它们之间的区别。 它们每个都有自己的文档部分,但两者都会影响构建系统,两者都是“预先存在的”,并且两者都可以基于其他 CMake 命令动态
我有一个包含多个子目录的 CMake 项目,例如: dir1 subdir11 subdir12 dir2 subdir21 subdir22 根 CMakeLists
如果您想将静态库链接到共享库或可执行文件,同时保持所有符号可见(例如,您可以稍后打开它以找到它们),在 Linux/BSD 上执行此操作的一种非可移植方式是使用标志-Wl,--whole-archiv
CMake 自动创建一个 FooTarget.cmake文件例如添加 install(EXPORT FooTargets FILE FooTargets.cmake NAMESPACE Foo
在CMake中,ELSE和ENDIF控制流函数将表达式作为参数。根据文档,这些是optional。那么这些目的是什么?仅仅是为了维护目的而使原始IF表达式更清晰,还是提供某些功能? 最佳答案 正如您所
我是 cmake 的新手,我发现它非常令人沮丧。我试图在构建运行时评估的文件路径中使用通配符,而不是在生成构建时。 我创建了一个构建,它使用 SWIG 为某些 C++ 代码生成 Java 包装器。我可
我可能在谷歌上搜索错误,但我无法找到 .cmake 文件的用途。 我刚刚偶然发现了一个我必须使用的项目的 CMake 工具,我很难理解它是如何工作的。我明白在包含 CMakeLists.txt 的目录
我是一名优秀的程序员,十分优秀!