A while ago, I posted about how I set up Xcode to work with Python. Yesterday, I was taking a class on Rust and decided to use my friendly neighborhood (sp)IDE(rman) coding environment, namely Xcode.
I’m not going to say it was a stunning success but there was enough interest that I thought I’d share the steps so you too could embrace Rust through Xcode.
Install Rust. You start, as one does, by installing Rust. Hop over to https://www.rust-lang.org/tools/install to grab a copy of the tools. They install to ~/.cargo, for whatever reason. I put a link in to / usr/local/bin.
Create a Project. Create an external build system Xcode project by choosing File > New > Project > Cross-platform > External Build System > Next. Enter a product name (I called mine “Rust” because that’s exactly how creative I am.) and set your build tool (in my case, /usr/local/bin/rustc
because of the link). Save it somewhere convenient.
Create a source file. Apparently “rs” (rust source?) is the proper extension. I went with “test” as my name. File > New > Empty > test.rs
fn main() {
println!("hello world");
}
Don’t forget to add some code.
Compile. Edit your scheme. Choose Run > Info > Build Executable > Other and select your compiler. Adding it to /usr/local/bin made it easier to select rustc
for me. Then uncheck Debug executable because you’re not debugging the Rust compiler.
At this point you can click Run and you’ll see the standard option message because you haven’t specified what it should run.
Back in the scheme editor select Run > Arguments and add the source file and output file. Unfortunately, I could not get this to work with SRCROOT at all, so here it is in all its glory with complete paths.
The Pre-action removes any build product from a previous run:
So here we are. With luck, it compiles. If not, the errors appear in pretty horrible form in the Xcode console, where curses is what we do, not how the console interprets pretty text output.
You can get slightly less horrible feedback by adding the launch argument: –error-format=json
Yeah, it’s wordy but it’s slightly less awful.
Pick a path. Unlike python, rust is just a compiler. If you build, and then add a step execute, the execution output (unlike compiler errors) will not normally print at the Xcode console. The challenge is to get that information in some form where you can access it.
At first I went with a little post-action osascript and threw up the output in a separate window:
But I really wanted to make it work with the console So back I went to Applescripting. Instead of rustc, I changed my build tool to osascript:
I added this instead to my run scheme arguments.
Yep, I’m using osascript to run a shell script that just compiles with rust and then runs it, passing the output through back to Xcode.
I know this is bad. I know I should be ashamed. I hang my head.
But you know what? It works. Stray osascript-crud and all:
I’m not sure how much this makes me a programming outcast but it was kind of fun to figure out how far I could push my beloved enemy Xcode.
4 Comments
… and what about debugging?
The debug output from the compiler shows up in the Xcode console.
Hi Erica!
I’ve just spent the last week learning AppleScript and hacking about with automating Xcode. Would you mind elaborating on how you manage to get text into the Xcode console area? My efforts revolve around automating window layouts for various coding scenarios and automatic run destination selection driven from configuration settings.
I spent some months a year ago learning and coding Rust. Eventually figured I’d make more of a living with iOS, so put it on the back-burner.
Ray
You tell the Xcode application to display a dialog