「なぜ?」、「役に立たない?」、「気にしないで」というコメントは気にしないでください。clang を使用して、別のプログラム内でプログラムをコンパイルしたいと考えています。を作成NSTask
して引数を設定すると、ファイルが存在する (つまり、ストリームがない) 場合に機能し、物理ファイルに書き込みます。入力と出力の両方にストリームを使用するという、本当に欲しいものを手に入れることができませんでした。-xc オプションと - オプションを使用しても、パイプを使用してその機能を実装できない場合、clang と gcc の両方で stdin をコンパイルできることを私は知っています。また、clang の出力をファイル ハンドルまたはストリームにリダイレクトする方法もわかりません。
これをコンパイルしてoutfileに正しい出力を生成するコードを次に示します
task = [[NSTask alloc] init];
NSPipe* outputPipe = [[NSPipe alloc] init];
[task setStandardOutput:outputPipe ];
[task setStandardError: [task standardOutput]];
NSPipe* inPipe = [NSPipe pipe];
[task setStandardInput:inPipe];
[task setLaunchPath:@"/usr/bin/clang"];
NSString* outfile= [NSString stringWithFormat:@"%@.out",[[filename lastPathComponent] stringByDeletingPathExtension]];
//[data writeToFile:@"file.c" atomically:YES];
[task setArguments:[NSArray arrayWithObjects:filename,@"-S",@"-o",outfile,nil]];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(getData:)
name: NSFileHandleReadCompletionNotification
object: [[task standardOutput] fileHandleForReading]];
[[[task standardOutput] fileHandleForReading] readInBackgroundAndNotify];
[task launch];
入力ストリームにこれを使用してみました:
/* on pipe creation*/
dup2([[inPipe fileHandleForReading] fileDescriptor], STDIN_FILENO);
NSFileHandle* curInputHandle = [inPipe fileHandleForWriting];
/* tried before launch and after, no output just sits */
[curInputHandle writeData:[NSData dataWithContentsOfFile:filename]];
場合によっては、NSTask がまだ存在している間にパイプが閉じると、出力ファイルが作成されて実行されると思います。これは、clangがstdinが閉じるのを待っているだけだと思います。データが読み取られたときにパイプを閉じる方法はありますか?
出力のために、NSPipe の fileHandleForWriting を -o のパラメーターとして使用しようとしましたが、[NSConcretePipe fileSystemRepresentation]
認識されないセレクターのエラーが発生します。同じエラーに対して、stdout のファイル記述子を使用してファイル ハンドルを作成しようとしました。それをリダイレクトするコマンドライン引数は知りません。リダイレクトに使用しようとしまし|
たが、機能させることができませんでした。リダイレクトするUNIXマジックがあれば、stdoutを好きな場所に複製できます。
すべてのデータが読み取られたときにパイプを閉じる方法はありますか? そして、clangs出力をリダイレクトしますか? 同じことをより簡単にまたはよりクリーンに達成する方法が他にある場合、私はどのような実装にもオープンです。これらの 2 つの項目に関するヘルプは非常に優れています。