Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to automate creation of new Xcode targets from Applescript/Automator/Shell Script

I am currently working on a way to automate the process of adding new targets to my Xcode projects. One target has to be added to multiple Xcode projects and each target in the different project needs the same source files to be added, same groups to store the source files in the Xcode project, and the same build settings. Doing this manually can take a while and is very prone to human error, and I have to do this task fairly often. I have already written a script to generate new source files, copy them to system folders, edit source files with new information etc, but now I need to automate the Xcode part.

This sums up what I want my automation to achieve:

Open an Xcode project at /this/path/project.xcodeproj

Duplicate an existing target and rename it

Edit the Build Settings of the new target

Add a group to the Source and Resources section, then rename them

Add source files to the groups, and add the file to the new Target

Close Xcode

Ideally I want this to run from my Bourne Shell script, I know you can launch automator workflows from there. What is the best approach to achieve this though?

like image 778
orgazoid Avatar asked Apr 22 '10 21:04

orgazoid


1 Answers

let me start with this script (for Xcode 4.2.1),

  • Open an XCode project at /this/path/project.xcodeproj (done)
  • Duplicate an existing target and rename it (not implemented)
  • Edit the Build Settings of the new target (done)
  • Add a group to the Source and Resources section, then rename them (done)
  • Add source files to the groups, and add the file to the new Target(partially)
  • Close XCode (done)

!/usr/bin/osascript

# Reference: AppleScript Editor -> File -> Open Directory ... -> Xcode 4.2.1  # http://vgable.com/blog/2009/04/24/how-to-check-if-an-application-is-running-with-applescript/ on ApplicationIsRunning(appName)     tell application "System Events" to set appNameIsRunning to exists (processes where name is appName)     return appNameIsRunning end ApplicationIsRunning  if not ApplicationIsRunning("Xcode") then     log ("Launching Xcode ...")     launch application id "com.apple.dt.Xcode"     delay 5 else     log("Xcode is already running ...") end if  set project_path to "/PATH/TO/YOUR_PROJECT.xcodeproj" log ("Open an XCode project at " & project_path)  set _project_name to (do shell script "echo $(basename " & project_path & ") | sed -e 's/.xcodeproj//'") log ("project_name set to " & _project_name)  set _target_name to "YOUR_TARGET"  tell application id "com.apple.dt.Xcode"     set _project_file to (POSIX file project_path as alias)     open _project_file     # load documentation set with path path_to_project display yes     set _workspace to active workspace document     set _project to first item of (projects of _workspace whose name = _project_name)     set _target to first item of (targets of _project whose name = _target_name)      # as this won't work, cannot event resort to system event     # duplicate _target with properties {name:_target_name & "_clone"}     # make new build configuration with data build configurations of _target with properties {name:_target_name & "_clone"}     # activate      log ("Edit the Build Settings of the new target")     set _build_configuration to first item of (build configurations of _target whose name = "Debug")     set value of build setting "PRODUCT_NAME" of _build_configuration to "KeySING"      # http://lists.apple.com/archives/xcode-users//2008/Feb/msg00497.html     log ("Add a group to the Source and Resources section, then rename them")     set _new_group_name to "groupX"     tell root group of _project         set _groups to (get groups whose name = _new_group_name)         if (length of _groups) = 0 then             set _new_group to make new group with properties {name:_new_group_name, path:_new_group_name, path type:group relative}         else             set _new_group to first item of _groups         end if          log ("Add source files to the groups, and add the file to the new Target")         tell _new_group             set _new_file_name to "whatever.h"             set _new_files to get (file references whose name = _new_file_name)             if (length of _new_files) = 0 then                 # Xcode crashes                 # make new file reference with properties ¬                 #     {name:_new_file_name, file encoding:utf8, path type:group relative,¬                 #      path:_new_file_name}             end if         end tell     end tell      log ("Close XCode")     quit  end tell 
like image 91
Dyno Fu Avatar answered Sep 18 '22 14:09

Dyno Fu