En un espacio de trabajo de Xcode 4, ¿cómo hago para crear configuraciones de configuración en cascada en subproyectos?
xcode4 xcodebuild (1)
Si modifica la estructura de su proyecto para usar un solo proyecto con múltiples objetivos, la configuración de compilación de cada objetivo se heredará automáticamente del proyecto. Desde allí, puede modificar las que desee que sean diferentes, o seleccionar una configuración individual y presionar la tecla eliminar para establecerla en el valor predeterminado especificado por el proyecto.
Visión general
Estoy usando bibliotecas estáticas y espacios de trabajo Xcode 4 para efectuar la modularidad en el desarrollo de iOS, una técnica cada vez más común. Por ejemplo, podría tener un espacio de trabajo que contenga un proyecto de aplicación y un proyecto de biblioteca, como 1 :
Entonces tendrías un esquema para construir estos que se parecían a esto:
Lo que me gustaría hacer es que la "compilación de la aplicación" controle la "compilación de la biblioteca" que inicia, al menos en un par de formas:
Asigne las configuraciones de la aplicación (por ejemplo, depuración, AdHoc) a configuraciones de biblioteca arbitrarias
Al pasar por algún subconjunto de -D se definen y / o se especifican estos para la compilación de la biblioteca.
Trataré cada uno de estos en su propia sección, pero vale la pena hacer algunas aclaraciones.
Aclaraciones
Estoy usando la aplicación / biblioteca aquí como un proxy fácil para cualquier relación de superproyecto / subproyecto que pueda tener.
Por lo que he visto, los subproyectos integrados al estilo Xcode 3 no parecen funcionar de manera diferente en Xcode 4 que los "compañeros" del área de trabajo. Me encantaría equivocarme sobre esto.
Sé que podría hacer casi cualquier cosa con una fase de compilación "Ejecutar script de compilación" y xcodebuild. Pero estoy tratando de trabajar dentro del sistema aquí, donde las dependencias se especifican en el esquema y, por lo demás, están algo acopladas.
La biblioteca existe para ser utilizada en más que solo este proyecto, por lo que no puede cargarlo arbitrariamente con basura específica para la compilación de esta aplicación, o hacer referencia a cualquier cosa particular a la aplicación o al área de trabajo. Para el caso general, esto excluye la inclusión de .xcconfig estático del proyecto de la aplicación como una forma de transmitir información de compilación de la aplicación a la biblioteca.
Construir la biblioteca fuera del área de trabajo sacrifica demasiado, no es una opción.
Mapeo de configuración
Como lo entiendo, la construcción de una configuración de aplicación particular hará lo siguiente
- Si existe una configuración en la biblioteca con el mismo nombre, la construirá usando eso.
- De lo contrario, construirá la configuración activa de la Biblioteca, como se especifica en el archivo de proyecto de la Biblioteca.
Que yo sepa, sin recurrir al truco de ejecución-creación-script mencionado anteriormente, es el alcance del control que se tiene sobre las configuraciones de construcción de subproyectos. Por favor dime diferente
Idealmente, podría especificar (en el esquema, presumiblemente):
AppConfigA -> LibConfig1
AppConfigB -> LibConfig2
Si bien Debug, AdHoc, y Release pueden ser las únicas configuraciones que algunos usan, los proyectos complejos a menudo superan eso.
Define
Todavía no he encontrado la forma de pasar -D define desde la compilación de la aplicación a la biblioteca, sin recurrir a xcodebuild, que puede llevar, por ejemplo, un archivo .xcconfig.
Se puede acceder a la configuración de compilación de la aplicación en la fase de compilación, ejecución y creación de la biblioteca. Sin embargo, hacer eso introduce una dependencia en la Biblioteca en el proyecto de la Aplicación, que por una buena razón es verboten (ver Aclaraciones). Pero incluso entonces, no he encontrado una forma de usar esas configuraciones para controlar directamente la compilación de la Biblioteca (mucho 2 ).
Tan loco que podría ...
Un esquema que se me ocurrió mientras escribía esto sería:
La Biblioteca basa sus configuraciones de compilación en un archivo
LibraryExternals.xcconfig
vacío (ficticio) dentro de su propio proyecto.Una limpieza de la biblioteca borra ese archivo. Una compilación independiente de la Biblioteca creará una vacía si no existe ya.
Ese archivo se sobrescribe con una fase de compilación de ejecución de aplicaciones, y contiene todo lo que la aplicación quiere comunicar a la compilación de la biblioteca.
Parece un poco complicado, pero estoy buscando algo ahora mismo. Voy a empujar esto a una respuesta si no aparece nada mejor.
1 Las aplicaciones que se muestran son Max OS X. Encuentro que las aplicaciones de la línea de comandos facilitan las pruebas. Lo mismo se aplica.
2 Cf. Info.plist preprocesamiento, que aprendí durante esta investigación.