Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无论指定的文件是否更改,如何使CMake目标执行? 我试图在我的C++项目中使用ANTLR。我为运行指定语法的ANTLR生成器创建了一个目标,并使主prjct依赖于它 ADD_CUSTOM_TARGET(GenerateParser COMMAND ${ANTLR_COMMAND} ${PROJECT_SOURCE_DIR}/src/MyGrammar.g -o ${PROJECT_SOURCE_DIR}/src/MyGrammar ) ADD_LIBRARY(MainProject ${LIBRARY_TYPE} ${TARGET_SOURCES} ${TARGET_OPTIONS}) ADD_DEPENDENCIES(MainProject GenerateParser)_Cmake_Antlr - Fatal编程技术网

无论指定的文件是否更改,如何使CMake目标执行? 我试图在我的C++项目中使用ANTLR。我为运行指定语法的ANTLR生成器创建了一个目标,并使主prjct依赖于它 ADD_CUSTOM_TARGET(GenerateParser COMMAND ${ANTLR_COMMAND} ${PROJECT_SOURCE_DIR}/src/MyGrammar.g -o ${PROJECT_SOURCE_DIR}/src/MyGrammar ) ADD_LIBRARY(MainProject ${LIBRARY_TYPE} ${TARGET_SOURCES} ${TARGET_OPTIONS}) ADD_DEPENDENCIES(MainProject GenerateParser)

无论指定的文件是否更改,如何使CMake目标执行? 我试图在我的C++项目中使用ANTLR。我为运行指定语法的ANTLR生成器创建了一个目标,并使主prjct依赖于它 ADD_CUSTOM_TARGET(GenerateParser COMMAND ${ANTLR_COMMAND} ${PROJECT_SOURCE_DIR}/src/MyGrammar.g -o ${PROJECT_SOURCE_DIR}/src/MyGrammar ) ADD_LIBRARY(MainProject ${LIBRARY_TYPE} ${TARGET_SOURCES} ${TARGET_OPTIONS}) ADD_DEPENDENCIES(MainProject GenerateParser),cmake,antlr,Cmake,Antlr,问题是,每次我构建项目时,ANTLR生成器都会运行,并且会消耗足够的时间。我怎样才能让它只运行,不管我的语法是否已更改?或者可以让ANTLR以某种方式只为过时的语法生成解析器。添加自定义命令会起作用吗?在这里,您可以指定DEPENDS[DEPENDS…],这将使命令仅在依赖文件更改时执行 添加自定义命令(输出output1[output2…] 命令command1[ARGS][args1…] [命令命令命令2[ARGS][args2…]] [主要依赖项] [取决于[取决于…] [隐式依赖依赖1

问题是,每次我构建项目时,ANTLR生成器都会运行,并且会消耗足够的时间。我怎样才能让它只运行,不管我的语法是否已更改?或者可以让ANTLR以某种方式只为过时的语法生成解析器。

添加自定义命令会起作用吗?在这里,您可以指定DEPENDS[DEPENDS…],这将使命令仅在依赖文件更改时执行

添加自定义命令(输出output1[output2…] 命令command1[ARGS][args1…] [命令命令命令2[ARGS][args2…]] [主要依赖项] [取决于[取决于…] [隐式依赖依赖1…] [工作目录目录目录] [评论][逐字][附加])
add\u custom\u命令执行此操作,前提是您正确构造了对它的调用

像这样的方法应该会奏效:

ADD_CUSTOM_COMMAND(OUTPUT ${PROJECT_SOURCE_DIR}/src/MyGrammar
  COMMAND ${ANTLR_COMMAND} ${PROJECT_SOURCE_DIR}/src/MyGrammar.g
    -o ${PROJECT_SOURCE_DIR}/src/MyGrammar
  DEPENDS ${PROJECT_SOURCE_DIR}/src/MyGrammar.g
)

ADD_CUSTOM_TARGET(GenerateParser ALL
   DEPENDS ${PROJECT_SOURCE_DIR}/src/MyGrammar
)

ADD_LIBRARY(MainProject ${LIBRARY_TYPE} ${TARGET_SOURCES} ${TARGET_OPTIONS})
ADD_DEPENDENCIES(MainProject GenerateParser)

在这里,自定义目标每次都会“生成”,但它唯一要做的是生成它所依赖的输出的自定义命令,但前提是自定义命令的输出相对于其依赖文件已过期。

除了使用自定义目标的建议解决方案之外,如果您的目标依赖于某些生成的源,则通用工作流如下所示:

添加生成源文件的目标。我建议使用完整路径以避免错误

add_custom_command(OUTPUT ${GENERATED_SOURCE_FILE}
    COMMAND ${GENERATION COMMAND}
    DEPENDS ${DEPENDENCIES}
)
设置生成的源文件的生成属性。所以cmake不会抱怨缺少源文件

set_source_files_properties(${GENERATED_SOURCE_FILE} PROPERTIES
    GENERATED TRUE
)
像往常一样将生成的源添加到目标

add_executable(${YOUR_TARGET} SOURCES ${GENERATED_SOURCE_FILE})

因此,在建议的示例中,只有当某些${DEPENDENCIES}文件发生更改时,${GENERATION COMMAND}才会启动。

我有完全相同的问题。在阅读了makefile是如何生成的(因为cmake文档还有很多需要改进的地方),看起来最好的解决方案是使用输出表单的add_custom_命令。这是我的例子

add_custom_command(OUTPUT
                   # In my cmake file I list every file generated
                   ${PROJECT_SOURCE_DIR}/src/MyGrammar/file1
                   ${PROJECT_SOURCE_DIR}/src/MyGrammar/file2
                   COMMAND ${ANTLR_COMMAND} ${PROJECT_SOURCE_DIR}/src/MyGrammar.g
                   -o {PROJECT_SOURCE_DIR}/src/MyGrammar

                   # In my case I used a script checked into source control, 
                   # so I want to know when it changes too
                   DEPENDS ${ANTLR_COMMAND} ${PROJECT_SOURCE_DIR}/src/MyGrammar.g)

# cmake caches are problematic, so list the files in a variable
set(generated_sources src/MyGrammar/file1 src/MyGrammar/file2)
add_library(yourlib ${list_of_source_files} ${generated_sources})

然后,当您构建cmake时,在决定重新生成源代码之前,将检查命令和语法文件的更改。

似乎不起作用。据我所知,dependens仅适用于目标,例如,每当依赖目标发生更改(库重建等)时,都会执行命令。根据命令,无需手动将文件标记为生成的文件,默认情况下,它们被标记为生成的文件。我发现这对我不起作用。构建依赖于依赖于自定义命令输出的自定义目标的目标时,每次都会调用自定义命令,在我的例子中,每次都会导致下游重建。节省运行该命令的时间不是什么大问题,但是对过时的输出产生连锁反应是相当乏味的。您的解决方案中缺少了什么吗?它应该只在自定义命令的输入(取决于add_custom_命令)比输出新时调用该命令。您确定要传递到输出和依赖子句的值正确吗?仔细检查CMake文件中带有“message”的那些元素的值。我们遇到了这个问题-始终重建
添加\u自定义\u目标。不幸的是,目标是在我们无法控制的外部模块中定义的。因此,在这种情况下,使用
add_custom_命令的解决方案不适用。我正在寻找一个解决方案来控制何时调用目标。
add_custom_command(OUTPUT
                   # In my cmake file I list every file generated
                   ${PROJECT_SOURCE_DIR}/src/MyGrammar/file1
                   ${PROJECT_SOURCE_DIR}/src/MyGrammar/file2
                   COMMAND ${ANTLR_COMMAND} ${PROJECT_SOURCE_DIR}/src/MyGrammar.g
                   -o {PROJECT_SOURCE_DIR}/src/MyGrammar

                   # In my case I used a script checked into source control, 
                   # so I want to know when it changes too
                   DEPENDS ${ANTLR_COMMAND} ${PROJECT_SOURCE_DIR}/src/MyGrammar.g)

# cmake caches are problematic, so list the files in a variable
set(generated_sources src/MyGrammar/file1 src/MyGrammar/file2)
add_library(yourlib ${list_of_source_files} ${generated_sources})