4 votes

Comment configurer le système de construction externe de Xcode pour construire et nettoyer en utilisant des raccourcis standards ?

[Xcode 10.1, MacOS 10.14.1]

J'ai un projet qui utilise bmake (peut être n'importe quel make ) et le Makefile fournit un certain nombre de cibles. J'aimerais utiliser Xcode pour construire host et nettoyer le dossier de construction, mais j'ai du mal à trouver comment configurer Xcode pour qu'il me permette de le faire.

À partir de la ligne de commande, je construirais en utilisant bmake host et nettoyer en utilisant bmake clean . La raison pour laquelle j'utilise Xcode est que j'aime utiliser un IDE pour le débogage.

En Project -> Info (External Build Tool Configuration) Je l'ai fait :

Build Tool  :  /usr/local/bin/bmake
Arguments   :  host
Directory   :  None     <- I'm using the current path

Avec ces paramètres, Product -> Build construit mon objectif, mais Product -> Clean Build Folder ne fait rien, même si Xcode signale que le nettoyage a réussi.

Pour effectuer un nettoyage, je dois soit définir une autre cible à l'aide de l'option Arguments Le champ est fixé à clean et passer d'une cible à l'autre lors de la construction ou du nettoyage, ou utiliser une seule cible et changer le champ de l'argument selon que je construis ou que je nettoie. (Une façon vraiment maladroite de procéder).

Si je pars Arguments avec sa valeur par défaut $(ACTION) toutes les cibles sont construites (sauf clean), et le nettoyage ne fait rien d'utile.

J'ai lu https://stackoverflow.com/questions/15652316/setup-xcode-for-using-external-compiler mais cette question n'aborde pas ce problème.

Existe-t-il une meilleure façon de procéder ?

1voto

Vlad Points 161

L'approche que nous utilisons :

  1. Exécuter un système de construction externe (c'est-à-dire Make ou CMake) via script personnalisé à partir de la cible "Système de construction externe" ou simplement en tant que phase de construction "Exécuter script".
  2. A un moment donné de l'exécution du script personnalisé, enregistrer un fichier texte (disons CMakeStatus.txt ) à BUILT_PRODUCTS_DIR qui sera utilisé comme drapeau indiquant que Xcode a fait le ménage.
  3. Dans votre script personnalisé, vérifiez que CMakeStatus.txt est présent ou non. Si ce n'est pas le cas, reconstruisez votre système de construction externe.

Voici un exemple d'utilisation de Cmake et de reconstruction si Xcode a fait un nettoyage.

#!/usr/bin/env ruby -w

require 'fileutils'

# system("printenv | sort")

AppProjectName = ENV['PROJECT_NAME']
AppBuildRootDir = ENV['AWL_CMAKE_BUILDS']
AppBuildDirPath = ENV['BUILT_PRODUCTS_DIR']
AppPlatform = ENV['PLATFORM_NAME']
AppBuildConfig = ENV['CONFIGURATION']
AppTargetDeviceId = ENV['TARGET_DEVICE_IDENTIFIER']
if AppProjectName.nil?
   raise " Variable \"PROJECT_NAME\" is not passed to script."
end
if AppBuildRootDir.nil?
   raise " Variable \"AWL_CMAKE_BUILDS\" is not passed to script."
end
if AppBuildDirPath.nil?
   raise " Variable \"BUILT_PRODUCTS_DIR\" is not passed to script."
end
if AppPlatform.nil?
   raise " Variable \"PLATFORM_NAME\" is not passed to script."
end
if AppBuildConfig.nil?
   raise " Variable \"CONFIGURATION\" is not passed to script."
end

WhiteListedVars = ["PATH", "HOME"]
ENV.keys.each { |key|
   if !WhiteListedVars.include? key
      ENV[key] = nil
   end
}
AppNewEnvVars = `bash -l -c printenv`.strip.split("\n")
AppNewEnvVars.each { |var|
   components = var.split("=", 2)
   key = components[0]
   value = components[1]
   ENV[key] = value
}

# system("printenv | sort")

AppCmakeBuildDirPath = "#{AppBuildRootDir}/#{AppProjectName}"
AppCmakeCacheFilePath = "#{AppCmakeBuildDirPath}/CMakeCache.txt"
AppCmakeStatusFilePath = "#{AppBuildDirPath}/CMakeStatus.txt"

if !File.exist?(AppCmakeStatusFilePath) && Dir.exist?(AppCmakeBuildDirPath)
   puts " Deleting previous build at \"#{AppCmakeBuildDirPath}\"..."
   FileUtils.rm_rf(AppCmakeBuildDirPath)
end

if !File.exist?(AppCmakeCacheFilePath)
   puts " Generating Cmake for Platform \"#{AppPlatform}\"..."
   cmd = "cmake -G Xcode -B \"#{AppCmakeBuildDirPath}\" -DCMAKE_Swift_COMPILER_FORCED=true -DCMAKE_BUILD_TYPE=#{AppBuildConfig} "
   if AppPlatform == "macosx"
      cmd += "-DCMAKE_OSX_DEPLOYMENT_TARGET=10.13"
   elsif
      cmd += "-DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 -DCMAKE_SYSTEM_NAME=iOS"
   end
   puts cmd
   system cmd
   File.write(AppCmakeStatusFilePath, 'This file used just as a status flag to clean Cmake.')
end

puts " Building Cmake for Platform \"#{AppPlatform}\" ..."

cmd = "set -euf -o pipefail && cd \"#{AppCmakeBuildDirPath}\" && cmake --build \"#{AppCmakeBuildDirPath}\" -- -quiet CONFIGURATION_BUILD_DIR=\"#{AppBuildDirPath}\" "
if AppPlatform == "macosx"
   cmd += "-destination 'platform=OS X,arch=x86_64'"
elsif AppPlatform == "iphonesimulator"
   if AppTargetDeviceId.nil?
      raise " Variable \"TARGET_DEVICE_IDENTIFIER\" is not passed to script."
   end
   cmd += "-sdk iphonesimulator -destination 'platform=iOS Simulator,id=#{AppTargetDeviceId}'"
else
   if AppTargetDeviceId.nil?
      cmd += "-sdk iphoneos -destination generic/platform=iOS"
   else
      cmd += "-sdk iphoneos -destination 'platform=iOS,id=#{AppTargetDeviceId}'"
   end
end

# cmd += " | xcpretty"
puts cmd
system(cmd) or exit 1

1voto

TheDudeAbides Points 217

J'ai un projet basé sur un Makefile avec un clean et j'ai pu faire fonctionner cette cible dans Xcode 10.3 avec l'application standard Shift + + K en choisissant "Legacy Build System" (système de construction hérité) à partir de Fichier Paramètres du projet

"Build System" selection under File -> Project Settings in Xcode 10.3

Choisissez maintenant Produit Nettoyer ou utiliser le raccourci clavier. Accédez au navigateur de rapport ( + 9 ).

Cliquez avec le bouton droit de la souris quelque part au milieu du rapport de résultats "propres" le plus récent et choisissez "Expand All Transcripts" afin de voir la sortie verbale de l'invocation de make y compris toutes les variables d'environnement définies par Xcode :

Xcode Report navigator for 'Clean' report

En faisant défiler la page jusqu'au bas de cette sortie étendue, vous pourrez voir votre make clean la course à l'objectif.

J'espère que cela vous aidera !

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X