CreateKModInfo.perl [plain text]
use Getopt::Std;
use Cwd;
use File::Basename;
$cmdName = basename($0, '\.perl');
$inputName = 'CustomInfo.xml';
if ( ! -r $inputName ) {
print STDERR "$cmdName: Can't find ", cwd(), "/$inputName";
exit 1;
}
$ptypePath = "/Developer/ProjectTypes";
$xmldump = "$ptypePath/KernelExtension.projectType/Resources/xmldump";
$versionKey = "CFBundleVersion";
$modVersionKey = "Module/Version";
$nameKey = "Module/Name";
$initKey = "Module/Initialize";
$finalKey = "Module/Finalize";
$iokitKey1 = "Personality/IOProviderClass";
$iokitKey2 = "Personality/IOImports";
$defaultInit = "0";
$defaultFinal = "0";
getopts('dw');
sub lookupKey {
my ($dict, $key, $default) = @_;
my ($scaler);
$scaler = `$xmldump $dict $key 2> /dev/null` || undef $scaler;
if ( defined($scaler) )
{ chop $scaler; return $scaler; }
elsif (defined($default)) {
warn "$cmdName: Couldn't find $key in $inputName, using $default\n";
return $default;
}
return undef;
}
$projectName = &lookupKey($inputName, $nameKey,
${basename(cwd(), '.kmodproj')});
$subsystem = &lookupKey($inputName, $systemKey);
$iokitCheck = &lookupKey($inputName, $iokitKey1);
if ( !defined($iokitCheck) ) {
$iokitCheck = &lookupKey($inputName, $iokitKey2);
}
if ( defined($iokitCheck) ) {
$realInitFunc = $defaultInit;
$realFinalFunc = $defaultFinal;
}
else {
$realInitFunc = &lookupKey($inputName, $initKey, $defaultInit);
$realFinalFunc = &lookupKey($inputName, $finalKey, $defaultFinal);
}
$version = &lookupKey($inputName, $modVersionKey);
if ( !defined($version) ) {
if ( ! -r "../$inputName" ) {
print STDERR "$cmdName: Can't find ", cwd(), "/../$inputName";
exit 1;
}
$version = &lookupKey("../$inputName", $versionKey, "0.1a");
}
if ($realInitFunc ne $defaultInit) {
$initExtern = "$realInitFunc(kmod_info_t *ki, void *data);\n";
$initExtern = "__private_extern__ kern_return_t $initExtern";
}
if ($realFinalFunc ne $defaultFinal) {
$finalExtern = "$realFinalFunc(kmod_info_t *ki, void *data);\n";
$finalExtern = "__private_extern__ kern_return_t $finalExtern";
}
print "#include <mach/mach_types.h>
extern kern_return_t _start(kmod_info_t *ki, void *data);
extern kern_return_t _stop(kmod_info_t *ki, void *data);
$initExtern$finalExtern
KMOD_EXPLICIT_DECL($projectName, \"$version\", _start, _stop)
__private_extern__ kmod_start_func_t *_realmain = $realInitFunc;
__private_extern__ kmod_stop_func_t *_antimain = $realFinalFunc;
";