CMake: Pick first non-free team id for iOS Xcode projects
Previously we picked the first reported team id as found in the Xcode settings file. Now we pick the first non-free team id if there is one, otherwise we pick the first free one. This aligns with qmake behavior. Using a non-free team id usually leads to fewer issues with automatic code-signing. [ChangeLog][iOS][CMake] A non-free Xcode team id is now preferred for project signing. Pick-to: 6.2 6.3 Fixes: QTBUG-96341 Change-Id: I58618fe5c6ca04184812e9bf955a9cb0b3842447 Reviewed-by: Jörg Bornemann <joerg.bornemann@qt.io>
This commit is contained in:
parent
9174321000
commit
da4957c99b
@ -799,35 +799,98 @@ function(_qt_internal_find_ios_development_team_id out_var)
|
|||||||
-x -c "print IDEProvisioningTeams" "${xcode_preferences_path}"
|
-x -c "print IDEProvisioningTeams" "${xcode_preferences_path}"
|
||||||
OUTPUT_VARIABLE teams_xml
|
OUTPUT_VARIABLE teams_xml
|
||||||
ERROR_VARIABLE plist_error)
|
ERROR_VARIABLE plist_error)
|
||||||
|
|
||||||
|
# Parsing state.
|
||||||
|
set(is_free "")
|
||||||
|
set(current_team_id "")
|
||||||
|
set(parsing_is_free FALSE)
|
||||||
|
set(parsing_team_id FALSE)
|
||||||
|
set(first_team_id "")
|
||||||
|
|
||||||
|
# Parse the xml output and return the first encountered non-free team id. If no non-free team id
|
||||||
|
# is found, return the first encountered free team id.
|
||||||
|
# If no team is found, return an empty string.
|
||||||
|
#
|
||||||
|
# Example input:
|
||||||
|
#<plist version="1.0">
|
||||||
|
#<dict>
|
||||||
|
# <key>marty@planet.local</key>
|
||||||
|
# <array>
|
||||||
|
# <dict>
|
||||||
|
# <key>isFreeProvisioningTeam</key>
|
||||||
|
# <false/>
|
||||||
|
# <key>teamID</key>
|
||||||
|
# <string>AAA</string>
|
||||||
|
# ...
|
||||||
|
# </dict>
|
||||||
|
# <dict>
|
||||||
|
# <key>isFreeProvisioningTeam</key>
|
||||||
|
# <true/>
|
||||||
|
# <key>teamID</key>
|
||||||
|
# <string>BBB</string>
|
||||||
|
# ...
|
||||||
|
# </dict>
|
||||||
|
# </array>
|
||||||
|
#</dict>
|
||||||
|
#</plist>
|
||||||
if(teams_xml AND NOT plist_error)
|
if(teams_xml AND NOT plist_error)
|
||||||
string(REPLACE "\n" ";" teams_xml_lines "${teams_xml}")
|
string(REPLACE "\n" ";" teams_xml_lines "${teams_xml}")
|
||||||
|
|
||||||
foreach(xml_line ${teams_xml_lines})
|
foreach(xml_line ${teams_xml_lines})
|
||||||
if(xml_line MATCHES "<key>(.+)</key>")
|
string(STRIP "${xml_line}" xml_line)
|
||||||
set(first_account "${CMAKE_MATCH_1}")
|
if(xml_line STREQUAL "<dict>")
|
||||||
string(STRIP "${first_account}" first_account)
|
# Clean any previously found values when a new team dict is matched.
|
||||||
break()
|
set(is_free "")
|
||||||
|
set(current_team_id "")
|
||||||
|
|
||||||
|
elseif(xml_line STREQUAL "<key>isFreeProvisioningTeam</key>")
|
||||||
|
set(parsing_is_free TRUE)
|
||||||
|
|
||||||
|
elseif(parsing_is_free)
|
||||||
|
set(parsing_is_free FALSE)
|
||||||
|
|
||||||
|
if(xml_line MATCHES "true")
|
||||||
|
set(is_free TRUE)
|
||||||
|
else()
|
||||||
|
set(is_free FALSE)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
elseif(xml_line STREQUAL "<key>teamID</key>")
|
||||||
|
set(parsing_team_id TRUE)
|
||||||
|
|
||||||
|
elseif(parsing_team_id)
|
||||||
|
set(parsing_team_id FALSE)
|
||||||
|
if(xml_line MATCHES "<string>([^<]+)</string>")
|
||||||
|
set(current_team_id "${CMAKE_MATCH_1}")
|
||||||
|
else()
|
||||||
|
continue()
|
||||||
|
endif()
|
||||||
|
|
||||||
|
string(STRIP "${current_team_id}" current_team_id)
|
||||||
|
|
||||||
|
# If this is the first team id we found so far, remember that, regardless if's free
|
||||||
|
# or not.
|
||||||
|
if(NOT first_team_id AND current_team_id)
|
||||||
|
set(first_team_id "${current_team_id}")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Break early if we found a non-free team id and use it, because we prefer
|
||||||
|
# a non-free team for signing, just like qmake.
|
||||||
|
if(NOT is_free AND current_team_id)
|
||||||
|
set(first_team_id "${current_team_id}")
|
||||||
|
break()
|
||||||
|
endif()
|
||||||
endif()
|
endif()
|
||||||
endforeach()
|
endforeach()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if(NOT first_account)
|
if(NOT first_team_id)
|
||||||
message(DEBUG "Failed to extract an Xcode development team id.")
|
message(DEBUG "Failed to extract an Xcode development team id.")
|
||||||
return()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Extract the first team ID
|
|
||||||
execute_process(COMMAND "/usr/libexec/PlistBuddy"
|
|
||||||
-c "print IDEProvisioningTeams:${first_account}:0:teamID"
|
|
||||||
"${xcode_preferences_path}"
|
|
||||||
OUTPUT_VARIABLE team_id
|
|
||||||
ERROR_VARIABLE team_id_error)
|
|
||||||
if(team_id AND NOT team_id_error)
|
|
||||||
message(DEBUG "Successfully extracted the first encountered Xcode development team id.")
|
|
||||||
string(STRIP "${team_id}" team_id)
|
|
||||||
set_property(GLOBAL PROPERTY _qt_internal_ios_development_team_id "${team_id}")
|
|
||||||
set("${out_var}" "${team_id}" PARENT_SCOPE)
|
|
||||||
else()
|
|
||||||
set("${out_var}" "" PARENT_SCOPE)
|
set("${out_var}" "" PARENT_SCOPE)
|
||||||
|
else()
|
||||||
|
message(DEBUG "Successfully extracted the first encountered Xcode development team id.")
|
||||||
|
set_property(GLOBAL PROPERTY _qt_internal_ios_development_team_id "${first_team_id}")
|
||||||
|
set("${out_var}" "${first_team_id}" PARENT_SCOPE)
|
||||||
endif()
|
endif()
|
||||||
endfunction()
|
endfunction()
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user