我有一个项目在根目录中有一个CMakeLists.txt文件,项目在Linux和OSX上编译得很好.现在我想为MIPS OpenWRT交叉编译它.我想尽可能自动化它,所以我将使用以下代码下载工具链并设置编译器变量:
ExternalProject_Add(ar71xx-toolchain
PREFIX "${PROJECT_BINARY_DIR}/external/openwrt"
URL "http://downloads.openwrt.org/barrier_breaker/14.07/ar71xx/generic/OpenWrt-Toolchain-ar71xx-for-mips_34kc-gcc-4.8-linaro_uClibc-0.9.33.2.tar.bz2"
UPDATE_COMMAND ""
PATCH_COMMAND ""
BUILD_COMMAND ""
CONFIGURE_COMMAND ""
INSTALL_COMMAND ""
)
ExternalProject_Get_Property(ar71xx-toolchain SOURCE_DIR)
SET(CMAKE_C_COMPILER ${SOURCE_DIR}/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-gcc)
SET(CMAKE_CXX_COMPILER ${SOURCE_DIR}/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-g++)
SET(CMAKE_STRIP ${SOURCE_DIR}/toolchain-mips_34kc_gcc-4.8-linaro_uClibc-0.9.33.2/bin/mips-openwrt-linux-strip)
Run Code Online (Sandbox Code Playgroud)
我认为我可以将它放在一个单独的工具链文件中并使用-DCMAKE_TOOLCHAIN_FILE传递它,但似乎在工具链文件中没有执行ExternalProject_Add.我想避免将工具链下载步骤放入主CMakeLists.txt中,因为它实际上对于项目本身并不重要,并且需要为每个目标平台做同样的事情......所以有没有办法为当前定义可选步骤交叉编译构建并以某种方式将其作为命令行参数传递,以便在主项目构建之前执行?
更新: 基于Tsyvarev的答案,在我的工具链文件中适用于我:
set(CMAKE_SYSTEM_NAME Linux)
set(TOOLCHAIN_DIR ${PROJECT_BINARY_DIR}/external/openwrt/toolchain)
if(NOT EXISTS ${TOOLCHAIN_DIR})
file(DOWNLOAD http://downloads.openwrt.org/barrier_breaker/14.07/ar71xx/generic/OpenWrt-Toolchain-ar71xx-for-mips_34kc-gcc-4.8-linaro_uClibc-0.9.33.2.tar.bz2 ${TOOLCHAIN_DIR}/toolchain.tar.bz2 SHOW_PROGRESS)
execute_process(COMMAND tar --strip-components=2 -xjf ${TOOLCHAIN_DIR}/toolchain.tar.bz2 WORKING_DIRECTORY ${TOOLCHAIN_DIR})
execute_process(COMMAND rm ${TOOLCHAIN_DIR}/toolchain.tar.bz2)
endif()
SET(CMAKE_C_COMPILER ${TOOLCHAIN_DIR}/bin/mips-openwrt-linux-gcc)
SET(CMAKE_CXX_COMPILER ${TOOLCHAIN_DIR}/bin/mips-openwrt-linux-g++)
SET(CMAKE_STRIP ${TOOLCHAIN_DIR}/bin/mips-openwrt-linux-strip)
SET(CMAKE_FIND_ROOT_PATH ${TOOLCHAIN_DIR})
SET(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
SET(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
SET(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
Run Code Online (Sandbox Code Playgroud)
将-DCMAKE_TOOLCHAIN_FILE作为CMAKE参数传递给使用ExternalProject_Add添加的其他项目时,会出现一个问题.由于它自己的$ {PROJECT_BINARY_DIR},它将再次下载工具链.但这是另一个问题......
是否可以有条件地将货物包包含在工作区中或告诉货物包 Cargo.toml 文件中的货物忽略它们?
假设我有一个包含包的工作区,它只能在合适的平台上编译。
[workspace]
members = [
"main",
"lib_common",
"lib_linux_only",
"lib_macos_only",
]
Run Code Online (Sandbox Code Playgroud)
所有 lib 包都是动态库,因此其中一些库不会在所有平台上构建,这是可以接受的(因为主可执行文件在运行时知道要加载或不加载其中的哪一个)。但它应该“悄然”发生。
在特定于平台的模块中,我有一个条件编译检查,例如
#[cfg(not(target_os = "linux"))]
compile_error!("This feature requires Linux");
Run Code Online (Sandbox Code Playgroud)
这意味着我无法运行主可执行文件,因为无法构建特定于平台的包。在这种情况下,我必须注释掉 mac 上的 linux 软件包和 linux 上的 mac 软件包。
我正在编写应用程序测试,并想检查当前是否显示了UIAlertView.这意味着我没有指向它的指针,我需要知道谁是所显示的UIAlertView的所有者或者可以找到它的视图堆栈.