2012-04-07 4 views
0

Also, ich brauche ein Skript, das eine Filepath als Eingabe nimmt und kompiliert & den Code ausführt (entweder C, C++, oder Ziel-C).Execute C/C++/Objective-C-Code-Datei über BASH-Skript (auf Mac OS X)

Ich gebe zu, ich bin kein BASH-Guru ... Also, gibt es einen besseren Weg, es zu tun? Was würden Sie ändern (und warum)?

Hier ist mein Code ...


C

input=$1; 
output=`echo "$1" | sed 's/\(.*\)\..*/\1/'` 
newinput="$output.c" 
cp $input $newinput 

gcc $newinput -o $output -std=c99 

status=$? 

if [ $status -eq 0 ] 
then 
$output 
exit 0 
elif [ $status -eq 127 ] 
then 
echo "gcc :: Compiler Not found" 
fi 

exit $status 

C++

input=$1; 
output=`echo "$1" | sed 's/\(.*\)\..*/\1/'` 
newinput="$output.cpp" 
cp $input $newinput 

g++ $newinput -o $output 

status=$? 

if [ $status -eq 0 ] 
then 
$output 
exit 0 
elif [ $status -eq 127 ] 
then 
echo "g++ :: Compiler Not found" 
fi 

exit $status 

Objective-C

input=$1; 
output=`echo "$1" | sed 's/\(.*\)\..*/\1/'` 
newinput="$output.m" 
cp $input $newinput 

clang $newinput -o $output -ObjC -std=c99 -framework Foundation 

status=$? 

if [ $status -eq 0 ] 
then 
$output 
exit 0 
elif [ $status -eq 127 ] 
then 
echo "gcc :: Compiler Not found" 
fi 

exit $status 

Antwort

1

Sie nicht angeben, wenn Sie Ihr Skript wollen die Quelle auf eine eindeutige Datei zu kompilieren, oder wenn Sie möchten, dass ausführbare Binärdatei entfernt werden. Vielleicht könnten Sie für C Verwendung so etwas wie:

#!/bin/sh 
input=$1 
## unique files for C code and for binary executable 
cfile=$(tempfile -s .c) 
binfile=$(tempfile -s .bin) 
## ensure they are removed at exit or interrupts 
trap "/bin/rm -f $cfile $binfile" EXIT QUIT INT TERM 
cp $input $cfile 
if gcc $cfile -o $binfile; then 
    $binfile 
else 
    echo C compilation of $input thru $cfile failed 
    exit 1 
fi 

und wenn Sie sicher sind Sie speziell gcc zu kompilieren verwenden, können Sie seine -x option als gcc -x c $input -o $binfile, ohne sich das Kopieren der Eingabe in eine .c suffixed Datei mit dem Namen verwenden könnten $cfile . Sie könnten versucht sein, auch -Wall -Werror -g -O an gcc zu übergeben. Und Sie sollten der Datei vertrauen, die Sie auf diese Weise erhalten (es gibt ein Sicherheitsrisiko, wenn diese Datei beispielsweise system ("/bin/rm -rf $HOME"); usw. enthält).

Ich habe keine Ahnung, ob Ihr Mac OS X-System hat gcc (vielleicht ist es clang oder cc) und die tempfile Dienstprogramm temporäre Dateinamen zu machen (vielleicht ist es mktemp, die anders aufgerufen werden sollen).