apps-projectcenter/Library/PCMakefileFactory.m
Sergii Stoian 1f6aad8624 Added methods into PCFileManager
git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/apps/projectcenter/trunk@20519 72102866-910b-0410-8b05-ffd578937521
2005-01-04 23:11:20 +00:00

322 lines
9 KiB
Objective-C

/*
GNUstep ProjectCenter - http://www.gnustep.org
Copyright (C) 2002-2004 Free Software Foundation
Authors: Philippe C.D. Robert
Serg Stoyan
This file is part of GNUstep.
This application is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This application is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU General Public
License along with this library; if not, write to the Free
Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111 USA.
*/
#include "PCDefines.h"
#include "PCProject.h"
#include "PCMakefileFactory.h"
#define COMMENT_HEADERS @"\n\n#\n# Header files\n#\n"
#define COMMENT_RESOURCES @"\n\n#\n# Resource files\n#\n"
#define COMMENT_CLASSES @"\n\n#\n# Class files\n#\n"
#define COMMENT_CFILES @"\n\n#\n# C files\n#\n"
#define COMMENT_SUBPROJECTS @"\n\n#\n# Subprojects\n#\n"
#define COMMENT_APP @"\n\n#\n# Main application\n#\n"
#define COMMENT_LIBRARIES @"\n\n#\n# Additional libraries\n#\n"
#define COMMENT_BUNDLE @"\n\n#\n# Bundle\n#\n"
#define COMMENT_LIBRARY @"\n\n#\n# Library\n#\n"
#define COMMENT_TOOL @"\n\n#\n# Tool\n#\n"
#define COMMENT_LOCALIZATION @"\n\n#\n# Localization\n#\n"
@implementation PCMakefileFactory
static PCMakefileFactory *_factory = nil;
+ (PCMakefileFactory *)sharedFactory
{
static BOOL isInitialised = NO;
if( isInitialised == NO )
{
_factory = [[PCMakefileFactory alloc] init];
isInitialised = YES;
}
return _factory;
}
- (void)createMakefileForProject:(NSString *)prName
{
NSAssert( prName, @"No project name given!");
AUTORELEASE( mfile );
mfile = [[NSMutableString alloc] init];
AUTORELEASE( pnme );
pnme = [prName copy];
[mfile appendString:@"#\n"];
[mfile appendString:@"# GNUmakefile - Generated by ProjectCenter\n"];
[mfile appendString:@"#\n"];
[mfile appendString:@"\ninclude $(GNUSTEP_MAKEFILES)/common.make\n"];
}
- (BOOL)createPreambleForProject:(PCProject *)project
{
NSMutableString *mfp = [[NSMutableString alloc] init];
NSString *mfl = nil;
NSArray *array = nil;
NSDictionary *projectDict = [project projectDict];
NSString *projectPath = [project projectPath];
// Create the new file
[mfp appendString:@"#\n"];
[mfp appendString:@"# GNUmakefile.preamble - Generated by ProjectCenter\n"];
[mfp appendString:@"#\n\n"];
// Preprocessor flags
[mfp appendString:@"# Additional flags to pass to the preprocessor\n"];
[mfp appendString:
[NSString stringWithFormat:@"ADDITIONAL_CPPFLAGS += %@\n\n",
[projectDict objectForKey:PCPreprocessorOptions]]];
// Objective C compiler flags
[mfp appendString:@"# Additional flags to pass to Objective C compiler\n"];
[mfp appendString:
[NSString stringWithFormat:@"ADDITIONAL_OBJCFLAGS += %@\n\n",
[projectDict objectForKey:PCObjCCompilerOptions]]];
// C compiler flags
[mfp appendString:@"# Additional flags to pass to C compiler\n"];
[mfp appendString:
[NSString stringWithFormat:@"ADDITIONAL_CFLAGS += %@\n\n",
[projectDict objectForKey:PCCompilerOptions]]];
// Linker flags
[mfp appendString:@"# Additional flags to pass to the linker\n"];
[mfp appendString:
[NSString stringWithFormat:@"ADDITIONAL_LDFLAGS += %@ ",
[projectDict objectForKey:PCLinkerOptions]]];
array = [projectDict objectForKey:PCLibraries];
if (array && [array count])
{
NSString *tmp;
NSEnumerator *enumerator = [array objectEnumerator];
while ((tmp = [enumerator nextObject]))
{
if (![tmp isEqualToString:@"gnustep-base"] &&
![tmp isEqualToString:@"gnustep-gui"])
{
[mfp appendString:[NSString stringWithFormat:@"-l%@ ",tmp]];
}
}
}
[mfp appendString:@"\n\n"];
// Directories where to search headers
[mfp appendString:
@"# Additional include directories the compiler should search\n"];
[mfp appendString:@"ADDITIONAL_INCLUDE_DIRS += "];
array = [projectDict objectForKey:PCSearchHeaders];
if (array && [array count])
{
NSString *tmp;
NSEnumerator *enumerator = [array objectEnumerator];
while ((tmp = [enumerator nextObject]))
{
[mfp appendString:[NSString stringWithFormat:@"-I%@ ",tmp]];
}
}
[mfp appendString:@"\n\n"];
// Directories where to search libraries
[mfp appendString:
@"# Additional library directories the linker should search\n"];
[mfp appendString:@"ADDITIONAL_LIB_DIRS += "];
array = [projectDict objectForKey:PCSearchLibs];
if (array && [array count])
{
NSString *tmp;
NSEnumerator *enumerator = [array objectEnumerator];
while ((tmp = [enumerator nextObject]))
{
[mfp appendString:[NSString stringWithFormat:@"-L%@ ",tmp]];
}
}
[mfp appendString:@"\n\n"];
// [mfp appendString:[projectDict objectForKey:PCLibraries]];
// Write the new file to disc!
mfl = [projectPath stringByAppendingPathComponent:@"GNUmakefile.preamble"];
if ([mfp writeToFile:mfl atomically:YES])
{
return YES;
}
return NO;
}
- (BOOL)createPostambleForProject:(PCProject *)project
{
NSBundle *bundle = nil;
NSString *template = nil;
NSString *postamble = nil;
NSFileManager *fm = [NSFileManager defaultManager];
bundle = [NSBundle bundleForClass:[self class]];
template = [bundle pathForResource:@"postamble" ofType:@"template"];
postamble = [[project projectPath]
stringByAppendingPathComponent:@"GNUmakefile.postamble"];
return [fm copyPath:template toPath:postamble handler:nil];
}
- (void)appendString:(NSString *)aString
{
NSAssert( mfile, @"No valid makefile available!");
NSAssert( aString, @"No valid string!");
[mfile appendString:aString];
}
- (void)appendHeaders:(NSArray *)array
{
[self appendHeaders:array forTarget:pnme];
}
- (void)appendHeaders:(NSArray *)array forTarget:(NSString *)target
{
[self appendString:COMMENT_HEADERS];
[self appendString:
[NSString stringWithFormat:@"%@_HEADER_FILES = \\\n", target]];
[self appendString:[array componentsJoinedByString:@" \\\n"]];
}
- (void)appendClasses:(NSArray *)array
{
[self appendClasses:array forTarget:pnme];
}
- (void)appendClasses:(NSArray *)array forTarget:(NSString *)target
{
[self appendString:COMMENT_CLASSES];
[self appendString:
[NSString stringWithFormat:@"%@_OBJC_FILES = \\\n",target]];
[self appendString:[array componentsJoinedByString:@" \\\n"]];
}
- (void)appendOtherSources:(NSArray *)array
{
[self appendOtherSources: array forTarget: pnme];
}
- (void)appendOtherSources:(NSArray *)array forTarget: (NSString *)target
{
NSMutableArray *marray = nil;
NSEnumerator *oenum;
NSString *file;
[self appendString:COMMENT_CFILES];
[self appendString:[NSString stringWithFormat:@"%@_C_FILES = ", target]];
if ( array == nil || [array count] == 0)
return;
/* Other Sources can have both m files and c files (possibly others?). */
oenum = [array objectEnumerator];
while ((file = [oenum nextObject]))
{
if ([file hasSuffix: @".m"])
{
if (marray == nil)
marray = [NSMutableArray arrayWithCapacity: 2];
[marray addObject: file];
}
else /* if ([f hasSuffix: @".c"]) */
{
[self appendString:[NSString stringWithFormat:@"\\\n%@ ",file]];
}
}
[self appendString: @"\n\n"];
[self appendString:[NSString stringWithFormat:@"%@_OBJC_FILES += ",pnme]];
if ( marray )
{
NSString *file;
NSEnumerator *enumerator = [marray objectEnumerator];
while ( (file = [enumerator nextObject]) )
{
[self appendString:[NSString stringWithFormat:@"\\\n%@ ", file]];
}
}
}
- (void)appendResources
{
[self appendString:COMMENT_RESOURCES];
[self appendString:
[NSString stringWithFormat:@"%@_RESOURCE_FILES = ",pnme]];
}
- (void)appendResourceItems:(NSArray *)array
{
if ([array count] <= 0)
{
return;
}
[self appendString:@"\\\n"];
[self appendString:[array componentsJoinedByString:@" \\\n"]];
}
- (void)appendLocalization
{
[self appendString:COMMENT_LOCALIZATION];
}
- (void)appendSubprojects:(NSArray*)array
{
[self appendString:COMMENT_SUBPROJECTS];
[self appendString:@"SUBPROJECTS = "];
if (array && [array count])
{
NSString *tmp;
NSEnumerator *enumerator = [array objectEnumerator];
while ((tmp = [enumerator nextObject]))
{
tmp = [tmp stringByAppendingPathExtension:@"subproj"];
[self appendString:[NSString stringWithFormat:@"\\\n%@ ",tmp]];
}
}
}
- (NSData *)encodedMakefile
{
NSAssert( mfile, @"No valid makefile available!");
return [mfile dataUsingEncoding:[NSString defaultCStringEncoding]];
}
@end