iOS: Generator expression TARGET_LINKER_FILE incorrect in iOS archive build mode
The following simple CMakeLists.txt:
cmake_minimum_required(VERSION 3.16)
set(CMAKE_OSX_ARCHITECTURES "x86_64" CACHE STRING "")
set(CMAKE_OSX_SYSROOT "iphonesimulator" CACHE STRING "")
set(CMAKE_OSX_DEPLOYMENT_TARGET "12" CACHE STRING "")
project(iosapp LANGUAGES CXX)
set(source_my_obj_lib "${CMAKE_BINARY_DIR}/source_my_obj_lib.cpp")
file(GENERATE OUTPUT "${source_my_obj_lib}" CONTENT "void bar() {}")
add_library(actual_my_obj_lib STATIC ${source_my_obj_lib})
set( MACOSX_BUNDLE_BUNDLE_NAME "ObjLibApp" )
set( MACOSX_BUNDLE_GUI_IDENTIFIER "org.alcroito.cmake.obj.lib.test.app")
set( MACOSX_BUNDLE_INFO_STRING "test project" )
set( MACOSX_BUNDLE_SHORT_VERSION_STRING "0.1" )
set( MACOSX_BUNDLE_LONG_VERSION_STRING "0.1.0" )
set( MACOSX_BUNDLE_BUNDLE_VERSION "0.1" )
set( MACOSX_BUNDLE_COPYRIGHT "" )
set(app_cpp "${CMAKE_BINARY_DIR}/main.cpp")
file(GENERATE OUTPUT "${app_cpp}" CONTENT "int main() { return 0; }")
add_executable(iosapp ${app_cpp})
target_link_libraries(iosapp PRIVATE actual_my_obj_lib)
add_custom_command(
TARGET actual_my_obj_lib
POST_BUILD
COMMAND echo "Paths to static library $<TARGET_LINKER_FILE:actual_my_obj_lib>"
COMMAND ls -la "$<TARGET_LINKER_FILE:actual_my_obj_lib>"
COMMAND test -e "$<TARGET_LINKER_FILE:actual_my_obj_lib>" || exit
COMMENT "Test custom command."
COMMAND_EXPAND_LISTS
)
Succeeds in iOS regular build mode:
mkdir build && cd build && cmake .. -DCMAKE_SYSTEM_NAME=iOS -GXcode
xcodebuild -configuration Release -scheme iosapp
, but fails in iOS archive build mode:
mkdir build && cd build && cmake .. -DCMAKE_SYSTEM_NAME=iOS -GXcode
xcodebuild -configuration Release -scheme iosapp -archivePath $PWD/my.xcarchive archive
, with:
Paths to static library /Users/milanbulat/dev/cmake_bug/build/Release-iphonesimulator/libactual_my_obj_lib.a
ls: /Users/milanbulat/dev/cmake_bug/build/Release-iphonesimulator/libactual_my_obj_lib.a: No such file or directory
Command PhaseScriptExecution failed with a nonzero exit code
If you first build in regular build mode and then in archive mode, the archive build will succeed because regular build mode will build the file /Users/milanbulat/dev/cmake_bug/build/Release-iphonesimulator/libactual_my_obj_lib.a, so archive mode will pick it up, but this is, of course, not correct.
This bug breaks various custom commands which manipulate static libraries in our build pipeline. Also, archive mode build is required to produce .ipa files for uploading to the Apple store.