3 votos

¿Cómo configurar el sistema de construcción externo de Xcode para construir y limpiar utilizando los atajos estándar?

[Xcode 10.1, MacOS 10.14.1]

Tengo un proyecto que utiliza bmake (puede ser cualquier make sin embargo) y el Makefile proporciona una serie de objetivos. Me gustaría utilizar Xcode para construir host y limpiar la carpeta de construcción, pero estoy teniendo problemas para configurar Xcode para permitirme esto.

Desde la línea de comandos, yo construiría usando bmake host y limpiar utilizando bmake clean . La razón por la que estoy usando Xcode para esto es porque me gusta usar un IDE para la depuración.

En Project -> Info (External Build Tool Configuration) lo he hecho:

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

Con estos ajustes, Product -> Build construye mi objetivo, pero Product -> Clean Build Folder no hace nada a pesar de que Xcode informa de que la limpieza tuvo éxito.

Para hacer realmente una limpieza, tengo que definir otro objetivo con el Arguments campo establecido en clean y luego cambiar entre los objetivos al construir/limpiar, o bien, utilizar un solo objetivo y cambiar el campo de argumento dependiendo de si estoy construyendo o limpiando. (Una forma realmente torpe de hacerlo).

Si me voy Arguments con su valor por defecto $(ACTION) todos los objetivos se construyen (excepto el de limpieza), y la limpieza no hace nada útil.

He leído https://stackoverflow.com/questions/15652316/setup-xcode-for-using-external-compiler pero esa pregunta no aborda este problema.

¿Hay una forma mejor de hacerlo?

1voto

Vlad Puntos 131

El enfoque que estamos utilizando:

  1. Ejecutar el sistema de construcción externo (es decir, Make o CMake) a través de un script personalizado desde el objetivo "Sistema de construcción externo" o simplemente como una fase de construcción "Ejecutar script".
  2. En algún momento de la ejecución del scriptpersonalizado guarda un archivo de texto (digamos CMakeStatus.txt ) a BUILT_PRODUCTS_DIR que se utilizará como bandera indicando que Xcode ha limpiado.
  3. En tu script personalizado comprueba que CMakeStatus.txt está presente o no. Si no es así, entonces reconstruya su sistema de construcción externo.

Aquí está el ejemplo de usar Cmake y reconstruirlo si Xcode hizo una limpieza.

#!/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 Puntos 157

Tengo un proyecto basado en Makefile con un clean y he podido conseguir que ese objetivo se ejecute en Xcode 10.3 con el estándar Shift + + K seleccionando "Legacy Build System" desde Archivo Configuración del proyecto

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

Ahora elige Producto Limpia o utilizar la tecla de acceso directo. Vaya al navegador de informes ( + 9 ).

Haga clic con el botón derecho del ratón en algún lugar del informe de resultados "limpio" más reciente y elija "Expandir todas las transcripciones" para ver la salida detallada de la invocación de make incluyendo todas las variables de entorno establecidas por Xcode:

Xcode Report navigator for 'Clean' report

Si se desplaza hasta la parte inferior de esta salida ampliada, podrá ver su make clean objetivo en marcha.

Espero que esto ayude.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X