xcode build-rules

¿Cómo puedo incluir condicionalmente un archivo basado en la configuración de compilación en Xcode?



build-rules (6)

(Probado con Xcode 9.3 )

No puedo encontrar cuándo Xcode incluyó esta función, pero EXCLUDED_SOURCE_FILE_NAMES ahora está disponible directamente en Build Settings > Build Options > Excluded Source File Names .

Por lo tanto, ya no es necesario crear una User-Defined Setting .

Vea abajo:

Se agregará automáticamente esta línea en su .pbxproj .

Tengo un proyecto de Xcode con una gran cantidad de objetivos en los que me gustaría incluir un conjunto de configuraciones para las aplicaciones creadas en las configuraciones Ad-hoc y Debug, pero no en la configuración de Release.

Las fases de compilación no parecen permitir que se condicionen a la configuración (obviamente pueden estar condicionadas al objetivo, pero duplicar el número de objetivos en el proyecto lo haría completamente inutilizable).

Eso deja escribir una regla de compilación personalizada. Mi plan es excluir Settings.bundle de todos los objetivos y crear una regla de compilación que lo copie condicionalmente en el paquete del producto, pero los ejemplos aplicables son realmente difíciles de encontrar.

La regla de compilación que he comenzado tiene la configuración del Proceso establecida en "Archivos de origen con nombres que coinciden:" y Settings.bundle como el nombre. La configuración de Uso es "Script personalizado:".

Mi script personalizado es el siguiente (con la advertencia de que mi scripting bash está en un nivel de culto a la carga):

if [${CONFIGURATION} = ''Debug''] then cp -r ${INPUT_FILE_PATH} ${DERIVED_FILES_DIR}/. fi

Finalmente, tengo ${DERIVED_FILES_DIR}/Settings.bundle listado como un archivo de salida.

Desde que estoy aquí, debería ser obvio que no está funcionando. Mi primera pregunta es si hay algún lugar en el que pueda ver el resultado de las reglas de compilación como la ejecución para asegurarse de que 1) en realidad se está ejecutando y que 2) no tengo un error de sintaxis estúpido en alguna parte.

Además, ¿cuál es la ubicación correcta (en forma de una variable de entorno) para copiar la salida?


Finalmente lo resolví.

Para cada objetivo para el que desee incluir condicionalmente el conjunto de configuraciones, elija su Proyecto de la lista fuente, elija el objetivo y cambie a la pestaña "Crear fases".

Haga clic en el botón "Agregar fase de compilación" y seleccione "Agregar secuencia de ejecución".

Luego ingrese lo siguiente para el script:

if [ "${CONFIGURATION}" == "Debug" ]; then cp -r "${PROJECT_DIR}/Settings.bundle" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app" fi


No soy un experto en scripts de shell, pero creo que necesitas espacio entre los corchetes y la condición. Además, citar las variables puede ayudar:

if [ "${CONFIGURATION}" = "Debug" ] then cp -r "${INPUT_FILE_PATH}" "${DERIVED_FILES_DIR}"/. fi

En cuanto a la ubicación, utilizo "$BUILT_PRODUCTS_DIR"/"$FULL_PRODUCT_NAME" para la raíz de mi paquete de aplicaciones OS X.


Para las fuentes compiladas, existe una configuración de compilación definida por el usuario y mal documentada que se puede agregar. Los archivos pueden ser excluidos e incluidos a partir de la compilación

Vaya a la Configuración de compilación de su destino> Toque el botón +> Agregar configuración definida por el usuario

La clave es INCLUDED_SOURCE_FILE_NAMES o EXCLUDED_SOURCE_FILE_NAMES

El valor es una lista de rutas de archivos separadas por espacios

Ver referencia: http://lists.apple.com/archives/xcode-users/2009/Jun/msg00153.html


Sé que esta pregunta ya fue respondida, y la respuesta fue muy útil para mí, pero también quería lanzar mi propia solución modificada.

Mi requisito era tener diferentes paquetes de configuración para diferentes configuraciones de compilación, en lugar de simplemente no incluirlo en la versión. Asumiendo un enfoque simplista de solo configuraciones de depuración y liberación , aquí le mostramos cómo hacerlo:

Comience agregando 2 paquetes de configuraciones al proyecto, denominados Settings-debug.bundle y Settings-release.bundle y luego elimine estos archivos de la fase de compilación Copy Bundle Resources . A continuación, agregue una configuración de compilación definida por el usuario llamada SETTINGS_BUNDLE , que tiene valores diferentes para cada configuración:

Debug ${PROJECT_DIR}/relative/path/to/Settings-debug.bundle Release ${PROJECT_DIR}/relative/path/to/Settings-release.bundle

A continuación, agregue una fase de compilación run-script (después de Copy Bundle Resources ) llamada Copy Settings Bundle con una versión modificada del script en la solución de Frank.

cp -r "${SETTINGS_BUNDLE}/" "${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/Settings.bundle"

La diferencia aquí es que el paquete copiado siempre se llama Settings.bundle, independientemente del nombre de la fuente.

Luego, debe agregar otro script de fase de compilación para evitar errores de firma de código cuando los únicos cambios se encuentran en los paquetes de configuración. Obliga a que el paso de firma de código ocurra en cada compilación. Esto debería ejecutarse antes de la fase de compilación de los archivos fuente de compilación. Llamé a mi Force Codesign .

touch "${PROJECT_DIR}/relative/path/to/main.m"


Settings.bundle siempre se copia en el área de destino sin importar si se trata de una configuración Release o Debug. Entonces, tal vez necesites el siguiente código:

if [ ${CONFIGURATION} == "Release" ]; then rm -rf ${BUILT_PRODUCTS_DIR}/${PRODUCT_NAME}.app/Settings.bundle fi