在Android Studio CMake中使用add_custom_target构建

4

我在我的模块的CMakeLists.txt中创建了一些自定义目标执行,按照标准模板,通过以下方式在模块的build.gradle中被引用:

externalNativeBuild {
    cmake {
        path "CMakeLists.txt"
    }
}

CMakeLists.txt 包含以下命令(我认为这里包含了所有相关内容):

add_custom_command(
    OUTPUT ${BUILT_PRODUCT_FILEPATH} # The library built by ${CUSTOM_BUILD_COMMAND}, defined elsewhere
    COMMAND ${CUSTOM_BUILD_COMMAND} --product ${PRODUCT_NAME} ${CUSTOM_BUILD_ARGS}
    DEPENDS ${SOURCE_FILES} ${BUILT_PRODUCT_DEPENDENCIES}
    WORKING_DIRECTORY ${PROJECT_DIRECTORY}
    VERBATIM
)

add_custom_command(
    OUTPUT ${OUTPUT_PRODUCT_FILEPATH} # filename of BUILT_PRODUCT_FILEPATH in the CMAKE_LIBRARY_OUTPUT_DIRECTORY
    COMMAND ${CMAKE_COMMAND} -E copy ${BUILT_PRODUCT_FILEPATH} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}
    DEPENDS ${BUILT_PRODUCT_FILEPATH}
)

add_custom_target(
    ${PRODUCT_NAME} ALL  # NOTE: I'm using ALL here - could this be part of the issue?
    DEPENDS ${OUTPUT_PRODUCT_FILEPATH}
)

当我运行cmake -G Ninja $MODULE_PATH && cmake --build .时,我的目标被构建,并且.so库按预期出现在APK中。
此外,如果我在Android Studio中运行Refresh Linked C++ Projects并导航到$MODULE_PATH/.externalNativeBuild/cmake/debug/armeabi-v7a并运行ninja,则构建也可以正常工作(如上所述)。 无法工作的是仅从Android Studio内部按BuildMake ProjectRebuild Project或类似按钮。本机构建似乎在0秒内“完成”,但没有任何东西被构建。 build/intermediates/cmake目录甚至根本没有被创建。
问题是:当制作项目时,Android Studio构建哪些目标?如何让它构建我的自定义目标,因为任何其他环境都可以正常工作?

我是否需要添加一个install()命令来注册Android Studio到目标中?我无法使自定义目标与 install 命令一起工作。 - ephemer
2个回答

1
我也遇到了这个问题。经过一番摸索,我认为我找到了答案。Android Studio不会构建ALL_BUILD目标。因此,仅仅指定一个目标add_custom_target(<my_target> ALL ...)对于AS来说是不起作用的。我使用add_dependencies(<my_exe> <my_custom_target>)将我的自定义目标添加为我的主要可执行文件的依赖项,这样就可以正常工作了。

这个几乎可以工作,但是对我来说它引起了循环依赖错误,因为在my_custom_target中使用了$<TARGET_FILE:my_exe>命令。 - Top-Master

0

我也曾经为此苦恼过。在我的情况下,我只想构建自定义目标,因此没有依赖项可以用来强制构建。结果,原来有一种方法可以在gradle中指定要构建的目标。例如:

android {
    defaultConfig {
        externalNativeBuild {
            cmake {
                targets "my_custom_target_name", "any_other_target"
            }
        }
     }

    externalNativeBuild {
        cmake {
            path "CMakeLists.txt"
        }
    }
 }

这是更好的方法,因为它可以帮助避免循环依赖。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接