5 #include "../../rbuild.h"
7 #include "modulehandler.h"
13 map
<ModuleType
,MingwModuleHandler
*>*
14 MingwModuleHandler::handler_map
= NULL
;
16 MingwModuleHandler::ref
= 0;
19 MingwModuleHandler::fMakefile
= NULL
;
21 MingwModuleHandler::MingwModuleHandler ( ModuleType moduletype
)
24 handler_map
= new map
<ModuleType
,MingwModuleHandler
*>;
25 (*handler_map
)[moduletype
] = this;
28 MingwModuleHandler::~MingwModuleHandler()
38 MingwModuleHandler::SetMakefile ( FILE* f
)
43 /*static*/ MingwModuleHandler
*
44 MingwModuleHandler::LookupHandler ( const string
& location
,
45 ModuleType moduletype
)
48 throw Exception ( "internal tool error: no registered module handlers" );
49 MingwModuleHandler
* h
= (*handler_map
)[moduletype
];
52 throw UnknownModuleTypeException ( location
, moduletype
);
59 MingwModuleHandler::GetWorkingDirectory () const
65 MingwModuleHandler::GetExtension ( const string
& filename
) const
67 size_t index
= filename
.find_last_of ( '.' );
68 if (index
!= string::npos
)
69 return filename
.substr ( index
);
74 MingwModuleHandler::ReplaceExtension ( const string
& filename
,
75 const string
& newExtension
) const
77 size_t index
= filename
.find_last_of ( '.' );
78 if (index
!= string::npos
)
79 return filename
.substr ( 0, index
) + newExtension
;
84 MingwModuleHandler::GetModuleArchiveFilename ( const Module
& module
) const
86 return ReplaceExtension ( FixupTargetFilename ( module
.GetPath () ).c_str (),
91 MingwModuleHandler::GetImportLibraryDependencies ( const Module
& module
) const
93 if ( module
.libraries
.size () == 0 )
96 string
dependencies ( "" );
97 for ( size_t i
= 0; i
< module
.libraries
.size (); i
++ )
99 if ( dependencies
.size () > 0 )
101 const Module
* importedModule
= module
.project
.LocateModule ( module
.libraries
[i
]->name
);
102 assert ( importedModule
!= NULL
);
103 dependencies
+= FixupTargetFilename ( importedModule
->GetDependencyPath () ).c_str ();
109 MingwModuleHandler::GetModuleDependencies ( const Module
& module
) const
111 if ( module
.dependencies
.size () == 0 )
114 string
dependencies ( "" );
115 for ( size_t i
= 0; i
< module
.dependencies
.size (); i
++ )
117 if ( dependencies
.size () > 0 )
119 const Dependency
* dependency
= module
.dependencies
[i
];
120 const Module
* dependencyModule
= dependency
->dependencyModule
;
121 dependencies
+= dependencyModule
->GetTargets ();
127 MingwModuleHandler::GetAllDependencies ( const Module
& module
) const
129 string dependencies
= GetImportLibraryDependencies ( module
);
130 string s
= GetModuleDependencies ( module
);
140 MingwModuleHandler::GetSourceFilenames ( const Module
& module
) const
142 if ( module
.files
.size () == 0 )
145 string
sourceFilenames ( "" );
146 for ( size_t i
= 0; i
< module
.files
.size (); i
++ )
148 if ( sourceFilenames
.size () > 0 )
149 sourceFilenames
+= " ";
150 sourceFilenames
+= module
.files
[i
]->name
;
152 return sourceFilenames
;
156 MingwModuleHandler::GetObjectFilename ( const string
& sourceFilename
) const
158 return FixupTargetFilename ( ReplaceExtension ( sourceFilename
,
163 MingwModuleHandler::GetObjectFilenames ( const Module
& module
) const
165 if ( module
.files
.size () == 0 )
168 string
objectFilenames ( "" );
169 for ( size_t i
= 0; i
< module
.files
.size (); i
++ )
171 if ( objectFilenames
.size () > 0 )
172 objectFilenames
+= " ";
173 objectFilenames
+= GetObjectFilename ( module
.files
[i
]->name
);
175 return objectFilenames
;
179 MingwModuleHandler::GenerateGccDefineParametersFromVector ( const vector
<Define
*>& defines
) const
182 for (size_t i
= 0; i
< defines
.size (); i
++)
184 Define
& define
= *defines
[i
];
185 if (parameters
.length () > 0)
188 parameters
+= define
.name
;
189 if (define
.value
.length () > 0)
192 parameters
+= define
.value
;
199 MingwModuleHandler::GenerateGccDefineParameters ( const Module
& module
) const
201 string parameters
= GenerateGccDefineParametersFromVector ( module
.project
.defines
);
202 string s
= GenerateGccDefineParametersFromVector ( module
.defines
);
212 MingwModuleHandler::ConcatenatePaths ( const string
& path1
,
213 const string
& path2
) const
215 if ( ( path1
.length () == 0 ) || ( path1
== "." ) || ( path1
== "./" ) )
217 if ( path1
[path1
.length ()] == CSEP
)
218 return path1
+ path2
;
220 return path1
+ CSEP
+ path2
;
224 MingwModuleHandler::GenerateGccIncludeParametersFromVector ( const vector
<Include
*>& includes
) const
227 for ( size_t i
= 0; i
< includes
.size (); i
++ )
229 Include
& include
= *includes
[i
];
230 if (parameters
.length () > 0)
232 parameters
+= "-I" + include
.directory
;
238 MingwModuleHandler::GenerateGccModuleIncludeVariable ( const Module
& module
) const
241 string
name ( module
.name
+ "_CFLAGS" );
245 GenerateGccDefineParameters(module
).c_str(),
246 GenerateGccIncludeParameters(module
).c_str() );
251 MingwModuleHandler::GenerateGccIncludeParameters ( const Module
& module
) const
253 string parameters
= GenerateGccIncludeParametersFromVector ( module
.includes
);
254 string s
= GenerateGccIncludeParametersFromVector ( module
.project
.includes
);
255 if ( s
.length () > 0 )
264 MingwModuleHandler::GenerateMacros (
266 const vector
<File
*>& files
,
267 const vector
<Include
*>& includes
,
268 const vector
<Define
*>& defines
,
269 const vector
<If
*>& ifs
,
270 const string
& cflags_macro
,
271 const string
& nasmflags_macro
,
272 const string
& objs_macro
) const
276 if ( includes
.size() || defines
.size() )
281 cflags_macro
.c_str(),
283 for ( i
= 0; i
< includes
.size(); i
++ )
288 includes
[i
]->directory
.c_str() );
290 for ( i
= 0; i
< defines
.size(); i
++ )
292 Define
& d
= *defines
[i
];
297 if ( d
.value
.size() )
303 fprintf ( fMakefile
, "\n" );
313 for ( i
= 0; i
< files
.size(); i
++ )
318 ( i
%10 == 9 ? "\\\n\t" : " " ),
319 GetObjectFilename(files
[i
]->name
).c_str() );
321 fprintf ( fMakefile
, "\n" );
324 for ( i
= 0; i
< ifs
.size(); i
++ )
327 if ( rIf
.defines
.size() || rIf
.includes
.size() || rIf
.files
.size() || rIf
.ifs
.size() )
331 "ifeq (\"$(%s)\",\"%s\")\n",
332 rIf
.property
.c_str(),
351 MingwModuleHandler::GenerateMacros (
352 const Module
& module
,
353 const string
& cflags_macro
,
354 const string
& nasmflags_macro
,
355 const string
& objs_macro
) const
366 fprintf ( fMakefile
, "\n" );
370 "%s += $(PROJECT_CFLAGS)\n\n",
371 cflags_macro
.c_str () );
375 MingwModuleHandler::GenerateGccCommand ( const Module
& module
,
376 const string
& sourceFilename
,
378 const string
& cflagsMacro
) const
380 string objectFilename
= GetObjectFilename ( sourceFilename
);
381 return ssprintf ( "%s -c %s -o %s %s\n",
383 sourceFilename
.c_str (),
384 objectFilename
.c_str (),
385 cflagsMacro
.c_str () );
389 MingwModuleHandler::GenerateGccAssemblerCommand ( const Module
& module
,
390 const string
& sourceFilename
,
392 const string
& cflagsMacro
) const
394 string objectFilename
= GetObjectFilename ( sourceFilename
);
395 return ssprintf ( "%s -x assembler-with-cpp -c %s -o %s -D__ASM__ %s\n",
397 sourceFilename
.c_str (),
398 objectFilename
.c_str (),
399 cflagsMacro
.c_str () );
403 MingwModuleHandler::GenerateNasmCommand ( const Module
& module
,
404 const string
& sourceFilename
,
405 const string
& nasmflagsMacro
) const
407 string objectFilename
= GetObjectFilename ( sourceFilename
);
408 return ssprintf ( "%s -f win32 %s -o %s %s\n",
410 sourceFilename
.c_str (),
411 objectFilename
.c_str (),
412 nasmflagsMacro
.c_str () );
416 MingwModuleHandler::GenerateCommand ( const Module
& module
,
417 const string
& sourceFilename
,
419 const string
& cflagsMacro
,
420 const string
& nasmflagsMacro
) const
422 string extension
= GetExtension ( sourceFilename
);
423 if ( extension
== ".c" || extension
== ".C" )
424 return GenerateGccCommand ( module
,
428 else if ( extension
== ".s" || extension
== ".S" )
429 return GenerateGccAssemblerCommand ( module
,
433 else if ( extension
== ".asm" || extension
== ".ASM" )
434 return GenerateNasmCommand ( module
,
438 throw InvalidOperationException ( __FILE__
,
440 "Unsupported filename extension '%s' in file '%s'",
442 sourceFilename
.c_str () );
446 MingwModuleHandler::GenerateObjectFileTargets ( const Module
& module
,
447 const vector
<File
*>& files
,
448 const vector
<If
*>& ifs
,
450 const string
& cflagsMacro
,
451 const string
& nasmflagsMacro
) const
455 for ( i
= 0; i
< files
.size (); i
++ )
457 string sourceFilename
= files
[i
]->name
;
458 string objectFilename
= GetObjectFilename ( sourceFilename
);
461 objectFilename
.c_str (),
462 sourceFilename
.c_str () );
465 GenerateCommand ( module
,
469 nasmflagsMacro
).c_str () );
472 for ( i
= 0; i
< ifs
.size(); i
++ )
473 GenerateObjectFileTargets ( module
, ifs
[i
]->files
, ifs
[i
]->ifs
, cc
, cflagsMacro
, nasmflagsMacro
);
477 MingwModuleHandler::GenerateObjectFileTargets ( const Module
& module
,
479 const string
& cflagsMacro
,
480 const string
& nasmflagsMacro
) const
482 GenerateObjectFileTargets ( module
, module
.files
, module
.ifs
, cc
, cflagsMacro
, nasmflagsMacro
);
483 fprintf ( fMakefile
, "\n" );
487 MingwModuleHandler::GenerateArchiveTarget ( const Module
& module
,
489 const string
& objs_macro
) const
491 string archiveFilename
= GetModuleArchiveFilename ( module
);
492 string sourceFilenames
= GetSourceFilenames ( module
);
496 archiveFilename
.c_str (),
497 objs_macro
.c_str ());
500 "\t%s -rc %s %s\n\n",
502 archiveFilename
.c_str (),
503 objs_macro
.c_str ());
507 MingwModuleHandler::GenerateMacrosAndTargets (
508 const Module
& module
,
510 const string
& ar
) const
512 string cflagsMacro
= ssprintf("%s_CFLAGS",module
.name
.c_str());
513 string nasmflagsMacro
= ssprintf("%s_NASMFLAGS",module
.name
.c_str());
514 string objectsMacro
= ssprintf("%s_OBJS",module
.name
.c_str());
516 GenerateMacros ( module
, cflagsMacro
, nasmflagsMacro
, objectsMacro
);
518 // generate phony target for module name
519 fprintf ( fMakefile
, ".PHONY: %s\n",
520 module
.name
.c_str() );
521 fprintf ( fMakefile
, "%s: %s\n\n",
523 module
.GetPath().c_str() );
525 // future references to the macros will be to get their values
526 cflagsMacro
= ssprintf("$(%s)",cflagsMacro
.c_str());
527 nasmflagsMacro
= ssprintf("$(%s)",nasmflagsMacro
.c_str());
528 objectsMacro
= ssprintf("$(%s)",objectsMacro
.c_str());
530 GenerateArchiveTarget ( module
, ar
, objectsMacro
);
531 GenerateObjectFileTargets ( module
, cc
, cflagsMacro
, nasmflagsMacro
);
535 MingwModuleHandler::GenerateMacrosAndTargetsHost ( const Module
& module
) const
537 GenerateMacrosAndTargets ( module
, "${host_gcc}", "${host_ar}" );
541 MingwModuleHandler::GenerateMacrosAndTargetsTarget ( const Module
& module
) const
543 GenerateMacrosAndTargets ( module
, "${gcc}", "${ar}" );
547 MingwModuleHandler::GetInvocationDependencies ( const Module
& module
) const
550 for ( size_t i
= 0; i
< module
.invocations
.size (); i
++ )
552 Invoke
& invoke
= *module
.invocations
[i
];
553 if (invoke
.invokeModule
== &module
)
554 /* Protect against circular dependencies */
556 if ( dependencies
.length () > 0 )
558 dependencies
+= invoke
.GetTargets ();
564 MingwModuleHandler::GetInvocationParameters ( const Invoke
& invoke
) const
566 string
parameters ( "" );
568 for (i
= 0; i
< invoke
.output
.size (); i
++)
570 if (parameters
.length () > 0)
572 InvokeFile
& invokeFile
= *invoke
.output
[i
];
573 if (invokeFile
.switches
.length () > 0)
575 parameters
+= invokeFile
.switches
;
578 parameters
+= invokeFile
.name
;
581 for (i
= 0; i
< invoke
.input
.size (); i
++)
583 if (parameters
.length () > 0)
585 InvokeFile
& invokeFile
= *invoke
.input
[i
];
586 if (invokeFile
.switches
.length () > 0)
588 parameters
+= invokeFile
.switches
;
591 parameters
+= invokeFile
.name
;
598 MingwModuleHandler::GenerateInvocations ( const Module
& module
) const
600 if ( module
.invocations
.size () == 0 )
603 for ( size_t i
= 0; i
< module
.invocations
.size (); i
++ )
605 const Invoke
& invoke
= *module
.invocations
[i
];
607 if ( invoke
.invokeModule
->type
!= BuildTool
)
608 throw InvalidBuildFileException ( module
.node
.location
,
609 "Only modules of type buildtool can be invoked." );
611 string invokeTarget
= module
.GetInvocationTarget ( i
);
614 invoke
.GetTargets ().c_str (),
615 invokeTarget
.c_str () );
618 invokeTarget
.c_str (),
619 FixupTargetFilename ( invoke
.invokeModule
->GetPath () ).c_str () );
622 FixupTargetFilename ( invoke
.invokeModule
->GetPath () ).c_str (),
623 GetInvocationParameters ( invoke
).c_str () );
626 invokeTarget
.c_str () );
631 MingwModuleHandler::GetPreconditionDependenciesName ( const Module
& module
) const
633 return ssprintf ( "%s_precondition",
634 module
.name
.c_str () );
638 MingwModuleHandler::GeneratePreconditionDependencies ( const Module
& module
) const
640 string preconditionDependenciesName
= GetPreconditionDependenciesName ( module
);
641 string sourceFilenames
= GetSourceFilenames ( module
);
642 string dependencies
= GetModuleDependencies ( module
);
643 string s
= GetInvocationDependencies ( module
);
644 if ( s
.length () > 0 )
646 if ( dependencies
.length () > 0 )
653 preconditionDependenciesName
.c_str () );
656 preconditionDependenciesName
.c_str (),
657 dependencies
.c_str () );
658 const char* p
= sourceFilenames
.c_str();
659 const char* end
= p
+ strlen(p
);
662 const char* p2
= &p
[512];
665 while ( p2
> p
&& !isspace(*p2
) )
669 p2
= strpbrk ( p
, " \t" );
677 preconditionDependenciesName
.c_str ());
679 p
+= strspn ( p
, " \t" );
681 fprintf ( fMakefile
, "\n" );
685 static MingwBuildToolModuleHandler buildtool_handler
;
687 MingwBuildToolModuleHandler::MingwBuildToolModuleHandler()
688 : MingwModuleHandler ( BuildTool
)
693 MingwBuildToolModuleHandler::Process ( const Module
& module
)
695 GeneratePreconditionDependencies ( module
);
696 GenerateBuildToolModuleTarget ( module
);
697 GenerateInvocations ( module
);
701 MingwBuildToolModuleHandler::GenerateBuildToolModuleTarget ( const Module
& module
)
703 string
target ( FixupTargetFilename ( module
.GetPath () ) );
704 string archiveFilename
= GetModuleArchiveFilename ( module
);
706 GenerateMacrosAndTargetsHost ( module
);
708 fprintf ( fMakefile
, "%s: %s\n",
710 archiveFilename
.c_str () );
712 "\t${host_gcc} -o %s %s\n\n",
714 archiveFilename
.c_str () );
717 static MingwKernelModuleHandler kernelmodule_handler
;
719 MingwKernelModuleHandler::MingwKernelModuleHandler ()
720 : MingwModuleHandler ( Kernel
)
725 MingwKernelModuleHandler::Process ( const Module
& module
)
727 GeneratePreconditionDependencies ( module
);
728 GenerateKernelModuleTarget ( module
);
729 GenerateInvocations ( module
);
733 MingwKernelModuleHandler::GenerateKernelModuleTarget ( const Module
& module
)
735 static string
ros_junk ( "$(ROS_TEMPORARY)" );
736 //static string ros_output ( "$(ROS_INTERMEDIATE)" );
737 string
target ( FixupTargetFilename(module
.GetPath()) );
738 string workingDirectory
= GetWorkingDirectory ( );
739 string archiveFilename
= GetModuleArchiveFilename ( module
);
740 string importLibraryDependencies
= GetImportLibraryDependencies ( module
);
741 string base_tmp
= ros_junk
+ module
.name
+ ".base.tmp";
742 string junk_tmp
= ros_junk
+ module
.name
+ ".junk.tmp";
743 string temp_exp
= ros_junk
+ module
.name
+ ".temp.exp";
744 string gccOptions
= ssprintf ("-Wl,-T,%s" SSEP
"ntoskrnl.lnk -Wl,--subsystem,native -Wl,--entry,_NtProcessStartup -Wl,--image-base,0xC0000000 -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -mdll",
745 module
.GetBasePath ().c_str () );
747 GenerateMacrosAndTargetsTarget ( module
);
749 fprintf ( fMakefile
, "%s: %s %s\n",
751 archiveFilename
.c_str (),
752 importLibraryDependencies
.c_str () );
754 "\t${gcc} %s -Wl,--base-file,%s -o %s %s %s\n",
758 archiveFilename
.c_str (),
759 importLibraryDependencies
.c_str () );
764 "\t${dlltool} --dllname %s --base-file %s --output-exp %s --kill-at\n",
772 "\t${gcc} %s -Wl,%s -o %s %s %s\n",
776 archiveFilename
.c_str (),
777 importLibraryDependencies
.c_str () );
784 static MingwStaticLibraryModuleHandler staticlibrary_handler
;
786 MingwStaticLibraryModuleHandler::MingwStaticLibraryModuleHandler ()
787 : MingwModuleHandler ( StaticLibrary
)
792 MingwStaticLibraryModuleHandler::Process ( const Module
& module
)
794 GeneratePreconditionDependencies ( module
);
795 GenerateStaticLibraryModuleTarget ( module
);
796 GenerateInvocations ( module
);
800 MingwStaticLibraryModuleHandler::GenerateStaticLibraryModuleTarget ( const Module
& module
)
802 GenerateMacrosAndTargetsTarget ( module
);
806 static MingwKernelModeDLLModuleHandler kernelmodedll_handler
;
808 MingwKernelModeDLLModuleHandler::MingwKernelModeDLLModuleHandler ()
809 : MingwModuleHandler ( KernelModeDLL
)
814 MingwKernelModeDLLModuleHandler::Process ( const Module
& module
)
816 GeneratePreconditionDependencies ( module
);
817 GenerateKernelModeDLLModuleTarget ( module
);
818 GenerateInvocations ( module
);
822 MingwKernelModeDLLModuleHandler::GenerateKernelModeDLLModuleTarget ( const Module
& module
)
824 static string
ros_junk ( "$(ROS_TEMPORARY)" );
825 string
target ( FixupTargetFilename ( module
.GetPath () ) );
826 string workingDirectory
= GetWorkingDirectory ( );
827 string archiveFilename
= GetModuleArchiveFilename ( module
);
828 string importLibraryDependencies
= GetImportLibraryDependencies ( module
);
830 if (module
.importLibrary
!= NULL
)
832 fprintf ( fMakefile
, "%s:\n",
833 module
.GetDependencyPath ().c_str () );
836 "\t${dlltool} --dllname %s --def %s --output-lib %s --kill-at\n\n",
837 module
.GetTargetName ().c_str (),
838 FixupTargetFilename ( module
.GetBasePath () + SSEP
+ module
.importLibrary
->definition
).c_str (),
839 FixupTargetFilename ( module
.GetDependencyPath () ).c_str () );
842 if (module
.files
.size () > 0)
844 GenerateMacrosAndTargetsTarget ( module
);
846 fprintf ( fMakefile
, "%s: %s %s\n",
848 archiveFilename
.c_str (),
849 importLibraryDependencies
.c_str () );
852 "\t${gcc} -Wl,--subsystem,native -Wl,--entry,_DriverEntry@8 -Wl,--image-base,0x10000 -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -mdll -o %s %s %s\n\n",
854 archiveFilename
.c_str (),
855 importLibraryDependencies
.c_str () );
859 fprintf ( fMakefile
, "%s:\n",
861 fprintf ( fMakefile
, ".PHONY: %s\n\n",
867 static MingwNativeDLLModuleHandler nativedll_handler
;
869 MingwNativeDLLModuleHandler::MingwNativeDLLModuleHandler ()
870 : MingwModuleHandler ( NativeDLL
)
875 MingwNativeDLLModuleHandler::Process ( const Module
& module
)
877 GeneratePreconditionDependencies ( module
);
878 GenerateNativeDLLModuleTarget ( module
);
879 GenerateInvocations ( module
);
883 MingwNativeDLLModuleHandler::GenerateNativeDLLModuleTarget ( const Module
& module
)
885 static string
ros_junk ( "$(ROS_TEMPORARY)" );
886 string
target ( FixupTargetFilename ( module
.GetPath () ) );
887 string workingDirectory
= GetWorkingDirectory ( );
888 string archiveFilename
= GetModuleArchiveFilename ( module
);
889 string importLibraryDependencies
= GetImportLibraryDependencies ( module
);
891 if (module
.importLibrary
!= NULL
)
893 fprintf ( fMakefile
, "%s:\n",
894 module
.GetDependencyPath ().c_str () );
897 "\t${dlltool} --dllname %s --def %s --output-lib %s --kill-at\n\n",
898 module
.GetTargetName ().c_str (),
899 FixupTargetFilename ( module
.GetBasePath () + SSEP
+ module
.importLibrary
->definition
).c_str (),
900 FixupTargetFilename ( module
.GetDependencyPath () ).c_str () );
903 if (module
.files
.size () > 0)
905 GenerateMacrosAndTargetsTarget ( module
);
907 fprintf ( fMakefile
, "%s: %s %s\n",
909 archiveFilename
.c_str (),
910 importLibraryDependencies
.c_str () );
913 "\t${gcc} -Wl,--subsystem,native -Wl,--entry,_DllMainCRTStartup@12 -Wl,--image-base,0x10000 -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -nostdlib -mdll -o %s %s %s\n\n",
915 archiveFilename
.c_str (),
916 importLibraryDependencies
.c_str () );
920 fprintf ( fMakefile
, "%s:\n\n",
922 fprintf ( fMakefile
, ".PHONY: %s\n\n",
928 static MingwWin32DLLModuleHandler win32dll_handler
;
930 MingwWin32DLLModuleHandler::MingwWin32DLLModuleHandler ()
931 : MingwModuleHandler ( Win32DLL
)
936 MingwWin32DLLModuleHandler::Process ( const Module
& module
)
938 GeneratePreconditionDependencies ( module
);
939 GenerateWin32DLLModuleTarget ( module
);
940 GenerateInvocations ( module
);
944 MingwWin32DLLModuleHandler::GenerateWin32DLLModuleTarget ( const Module
& module
)
946 static string
ros_junk ( "$(ROS_TEMPORARY)" );
947 string
target ( FixupTargetFilename ( module
.GetPath () ) );
948 string workingDirectory
= GetWorkingDirectory ( );
949 string archiveFilename
= GetModuleArchiveFilename ( module
);
950 string importLibraryDependencies
= GetImportLibraryDependencies ( module
);
952 if (module
.importLibrary
!= NULL
)
954 fprintf ( fMakefile
, "%s:\n",
955 module
.GetDependencyPath ().c_str () );
958 "\t${dlltool} --dllname %s --def %s --output-lib %s --kill-at\n\n",
959 module
.GetTargetName ().c_str (),
960 FixupTargetFilename ( module
.GetBasePath () + SSEP
+ module
.importLibrary
->definition
).c_str (),
961 FixupTargetFilename ( module
.GetDependencyPath () ).c_str () );
964 if (module
.files
.size () > 0)
966 GenerateMacrosAndTargetsTarget ( module
);
968 fprintf ( fMakefile
, "%s: %s %s\n",
970 archiveFilename
.c_str (),
971 importLibraryDependencies
.c_str () );
974 "\t${gcc} -Wl,--subsystem,console -Wl,--entry,_DllMain@12 -Wl,--image-base,0x10000 -Wl,--file-alignment,0x1000 -Wl,--section-alignment,0x1000 -nostartfiles -nostdlib -mdll -o %s %s %s\n",
976 archiveFilename
.c_str (),
977 importLibraryDependencies
.c_str () );
981 fprintf ( fMakefile
, "%s:\n\n",
983 fprintf ( fMakefile
, ".PHONY: %s\n\n",