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 // future references to the macros will be to get their values
519 cflagsMacro
= ssprintf("$(%s)",cflagsMacro
.c_str());
520 nasmflagsMacro
= ssprintf("$(%s)",nasmflagsMacro
.c_str());
521 objectsMacro
= ssprintf("$(%s)",objectsMacro
.c_str());
523 GenerateArchiveTarget ( module
, ar
, objectsMacro
);
524 GenerateObjectFileTargets ( module
, cc
, cflagsMacro
, nasmflagsMacro
);
528 MingwModuleHandler::GenerateMacrosAndTargetsHost ( const Module
& module
) const
530 GenerateMacrosAndTargets ( module
, "${host_gcc}", "${host_ar}" );
534 MingwModuleHandler::GenerateMacrosAndTargetsTarget ( const Module
& module
) const
536 GenerateMacrosAndTargets ( module
, "${gcc}", "${ar}" );
540 MingwModuleHandler::GetInvocationDependencies ( const Module
& module
) const
543 for ( size_t i
= 0; i
< module
.invocations
.size (); i
++ )
545 Invoke
& invoke
= *module
.invocations
[i
];
546 if (invoke
.invokeModule
== &module
)
547 /* Protect against circular dependencies */
549 if ( dependencies
.length () > 0 )
551 dependencies
+= invoke
.GetTargets ();
557 MingwModuleHandler::GetInvocationParameters ( const Invoke
& invoke
) const
559 string
parameters ( "" );
561 for (i
= 0; i
< invoke
.output
.size (); i
++)
563 if (parameters
.length () > 0)
565 InvokeFile
& invokeFile
= *invoke
.output
[i
];
566 if (invokeFile
.switches
.length () > 0)
568 parameters
+= invokeFile
.switches
;
571 parameters
+= invokeFile
.name
;
574 for (i
= 0; i
< invoke
.input
.size (); i
++)
576 if (parameters
.length () > 0)
578 InvokeFile
& invokeFile
= *invoke
.input
[i
];
579 if (invokeFile
.switches
.length () > 0)
581 parameters
+= invokeFile
.switches
;
584 parameters
+= invokeFile
.name
;
591 MingwModuleHandler::GenerateInvocations ( const Module
& module
) const
593 if ( module
.invocations
.size () == 0 )
596 for ( size_t i
= 0; i
< module
.invocations
.size (); i
++ )
598 const Invoke
& invoke
= *module
.invocations
[i
];
600 if ( invoke
.invokeModule
->type
!= BuildTool
)
601 throw InvalidBuildFileException ( module
.node
.location
,
602 "Only modules of type buildtool can be invoked." );
604 string invokeTarget
= module
.GetInvocationTarget ( i
);
607 invoke
.GetTargets ().c_str (),
608 invokeTarget
.c_str () );
611 invokeTarget
.c_str (),
612 FixupTargetFilename ( invoke
.invokeModule
->GetPath () ).c_str () );
615 FixupTargetFilename ( invoke
.invokeModule
->GetPath () ).c_str (),
616 GetInvocationParameters ( invoke
).c_str () );
619 invokeTarget
.c_str () );
624 MingwModuleHandler::GetPreconditionDependenciesName ( const Module
& module
) const
626 return ssprintf ( "%s_precondition",
627 module
.name
.c_str () );
631 MingwModuleHandler::GeneratePreconditionDependencies ( const Module
& module
) const
633 string preconditionDependenciesName
= GetPreconditionDependenciesName ( module
);
634 string sourceFilenames
= GetSourceFilenames ( module
);
635 string dependencies
= GetModuleDependencies ( module
);
636 string s
= GetInvocationDependencies ( module
);
637 if ( s
.length () > 0 )
639 if ( dependencies
.length () > 0 )
646 preconditionDependenciesName
.c_str () );
649 preconditionDependenciesName
.c_str (),
650 dependencies
.c_str () );
651 const char* p
= sourceFilenames
.c_str();
652 const char* end
= p
+ strlen(p
);
655 const char* p2
= &p
[512];
658 while ( p2
> p
&& !isspace(*p2
) )
662 p2
= strpbrk ( p
, " \t" );
670 preconditionDependenciesName
.c_str ());
672 p
+= strspn ( p
, " \t" );
674 fprintf ( fMakefile
, "\n" );
678 static MingwBuildToolModuleHandler buildtool_handler
;
680 MingwBuildToolModuleHandler::MingwBuildToolModuleHandler()
681 : MingwModuleHandler ( BuildTool
)
686 MingwBuildToolModuleHandler::Process ( const Module
& module
)
688 GeneratePreconditionDependencies ( module
);
689 GenerateBuildToolModuleTarget ( module
);
690 GenerateInvocations ( module
);
694 MingwBuildToolModuleHandler::GenerateBuildToolModuleTarget ( const Module
& module
)
696 string
target ( FixupTargetFilename ( module
.GetPath () ) );
697 string archiveFilename
= GetModuleArchiveFilename ( module
);
699 GenerateMacrosAndTargetsHost ( module
);
701 fprintf ( fMakefile
, "%s: %s\n",
703 archiveFilename
.c_str () );
705 "\t${host_gcc} -o %s %s\n\n",
707 archiveFilename
.c_str () );
710 static MingwKernelModuleHandler kernelmodule_handler
;
712 MingwKernelModuleHandler::MingwKernelModuleHandler ()
713 : MingwModuleHandler ( Kernel
)
718 MingwKernelModuleHandler::Process ( const Module
& module
)
720 GeneratePreconditionDependencies ( module
);
721 GenerateKernelModuleTarget ( module
);
722 GenerateInvocations ( module
);
726 MingwKernelModuleHandler::GenerateKernelModuleTarget ( const Module
& module
)
728 static string
ros_junk ( "$(ROS_TEMPORARY)" );
729 //static string ros_output ( "$(ROS_INTERMEDIATE)" );
730 string
target ( FixupTargetFilename(module
.GetPath()) );
731 string workingDirectory
= GetWorkingDirectory ( );
732 string archiveFilename
= GetModuleArchiveFilename ( module
);
733 string importLibraryDependencies
= GetImportLibraryDependencies ( module
);
734 string base_tmp
= ros_junk
+ module
.name
+ ".base.tmp";
735 string junk_tmp
= ros_junk
+ module
.name
+ ".junk.tmp";
736 string temp_exp
= ros_junk
+ module
.name
+ ".temp.exp";
737 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",
738 module
.GetBasePath ().c_str () );
740 GenerateMacrosAndTargetsTarget ( module
);
742 fprintf ( fMakefile
, "%s: %s %s\n",
744 archiveFilename
.c_str (),
745 importLibraryDependencies
.c_str () );
747 "\t${gcc} %s -Wl,--base-file,%s -o %s %s %s\n",
751 archiveFilename
.c_str (),
752 importLibraryDependencies
.c_str () );
757 "\t${dlltool} --dllname %s --base-file %s --output-exp %s --kill-at\n",
765 "\t${gcc} %s -Wl,%s -o %s %s %s\n",
769 archiveFilename
.c_str (),
770 importLibraryDependencies
.c_str () );
777 static MingwStaticLibraryModuleHandler staticlibrary_handler
;
779 MingwStaticLibraryModuleHandler::MingwStaticLibraryModuleHandler ()
780 : MingwModuleHandler ( StaticLibrary
)
785 MingwStaticLibraryModuleHandler::Process ( const Module
& module
)
787 GeneratePreconditionDependencies ( module
);
788 GenerateStaticLibraryModuleTarget ( module
);
789 GenerateInvocations ( module
);
793 MingwStaticLibraryModuleHandler::GenerateStaticLibraryModuleTarget ( const Module
& module
)
795 GenerateMacrosAndTargetsTarget ( module
);
799 static MingwKernelModeDLLModuleHandler kernelmodedll_handler
;
801 MingwKernelModeDLLModuleHandler::MingwKernelModeDLLModuleHandler ()
802 : MingwModuleHandler ( KernelModeDLL
)
807 MingwKernelModeDLLModuleHandler::Process ( const Module
& module
)
809 GeneratePreconditionDependencies ( module
);
810 GenerateKernelModeDLLModuleTarget ( module
);
811 GenerateInvocations ( module
);
815 MingwKernelModeDLLModuleHandler::GenerateKernelModeDLLModuleTarget ( const Module
& module
)
817 static string
ros_junk ( "$(ROS_TEMPORARY)" );
818 string
target ( FixupTargetFilename ( module
.GetPath () ) );
819 string workingDirectory
= GetWorkingDirectory ( );
820 string archiveFilename
= GetModuleArchiveFilename ( module
);
821 string importLibraryDependencies
= GetImportLibraryDependencies ( module
);
823 if (module
.importLibrary
!= NULL
)
825 fprintf ( fMakefile
, "%s:\n",
826 module
.GetDependencyPath ().c_str () );
829 "\t${dlltool} --dllname %s --def %s --output-lib %s --kill-at\n\n",
830 module
.GetTargetName ().c_str (),
831 FixupTargetFilename ( module
.GetBasePath () + SSEP
+ module
.importLibrary
->definition
).c_str (),
832 FixupTargetFilename ( module
.GetDependencyPath () ).c_str () );
835 if (module
.files
.size () > 0)
837 GenerateMacrosAndTargetsTarget ( module
);
839 fprintf ( fMakefile
, "%s: %s %s\n",
841 archiveFilename
.c_str (),
842 importLibraryDependencies
.c_str () );
845 "\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",
847 archiveFilename
.c_str (),
848 importLibraryDependencies
.c_str () );
852 fprintf ( fMakefile
, "%s:\n",
854 fprintf ( fMakefile
, ".PHONY: %s\n\n",
860 static MingwNativeDLLModuleHandler nativedll_handler
;
862 MingwNativeDLLModuleHandler::MingwNativeDLLModuleHandler ()
863 : MingwModuleHandler ( NativeDLL
)
868 MingwNativeDLLModuleHandler::Process ( const Module
& module
)
870 GeneratePreconditionDependencies ( module
);
871 GenerateNativeDLLModuleTarget ( module
);
872 GenerateInvocations ( module
);
876 MingwNativeDLLModuleHandler::GenerateNativeDLLModuleTarget ( const Module
& module
)
878 static string
ros_junk ( "$(ROS_TEMPORARY)" );
879 string
target ( FixupTargetFilename ( module
.GetPath () ) );
880 string workingDirectory
= GetWorkingDirectory ( );
881 string archiveFilename
= GetModuleArchiveFilename ( module
);
882 string importLibraryDependencies
= GetImportLibraryDependencies ( module
);
884 if (module
.importLibrary
!= NULL
)
886 fprintf ( fMakefile
, "%s:\n",
887 module
.GetDependencyPath ().c_str () );
890 "\t${dlltool} --dllname %s --def %s --output-lib %s --kill-at\n\n",
891 module
.GetTargetName ().c_str (),
892 FixupTargetFilename ( module
.GetBasePath () + SSEP
+ module
.importLibrary
->definition
).c_str (),
893 FixupTargetFilename ( module
.GetDependencyPath () ).c_str () );
896 if (module
.files
.size () > 0)
898 GenerateMacrosAndTargetsTarget ( module
);
900 fprintf ( fMakefile
, "%s: %s %s\n",
902 archiveFilename
.c_str (),
903 importLibraryDependencies
.c_str () );
906 "\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",
908 archiveFilename
.c_str (),
909 importLibraryDependencies
.c_str () );
913 fprintf ( fMakefile
, "%s:\n\n",
915 fprintf ( fMakefile
, ".PHONY: %s\n\n",
921 static MingwWin32DLLModuleHandler win32dll_handler
;
923 MingwWin32DLLModuleHandler::MingwWin32DLLModuleHandler ()
924 : MingwModuleHandler ( Win32DLL
)
929 MingwWin32DLLModuleHandler::Process ( const Module
& module
)
931 GeneratePreconditionDependencies ( module
);
932 GenerateWin32DLLModuleTarget ( module
);
933 GenerateInvocations ( module
);
937 MingwWin32DLLModuleHandler::GenerateWin32DLLModuleTarget ( const Module
& module
)
939 static string
ros_junk ( "$(ROS_TEMPORARY)" );
940 string
target ( FixupTargetFilename ( module
.GetPath () ) );
941 string workingDirectory
= GetWorkingDirectory ( );
942 string archiveFilename
= GetModuleArchiveFilename ( module
);
943 string importLibraryDependencies
= GetImportLibraryDependencies ( module
);
945 if (module
.importLibrary
!= NULL
)
947 fprintf ( fMakefile
, "%s:\n",
948 module
.GetDependencyPath ().c_str () );
951 "\t${dlltool} --dllname %s --def %s --output-lib %s --kill-at\n\n",
952 module
.GetTargetName ().c_str (),
953 FixupTargetFilename ( module
.GetBasePath () + SSEP
+ module
.importLibrary
->definition
).c_str (),
954 FixupTargetFilename ( module
.GetDependencyPath () ).c_str () );
957 if (module
.files
.size () > 0)
959 GenerateMacrosAndTargetsTarget ( module
);
961 fprintf ( fMakefile
, "%s: %s %s\n",
963 archiveFilename
.c_str (),
964 importLibraryDependencies
.c_str () );
967 "\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",
969 archiveFilename
.c_str (),
970 importLibraryDependencies
.c_str () );
974 fprintf ( fMakefile
, "%s:\n\n",
976 fprintf ( fMakefile
, ".PHONY: %s\n\n",