[ros-diffs] [cwittich] 24820: -added cpl applet debugging support -added naive target support (custom C::B version needed atm) -handle linker options like baseaddress, entrypoint, stdlib and alignment -use def files when linking dlls

cwittich at svn.reactos.org cwittich at svn.reactos.org
Fri Nov 24 11:46:14 CET 2006


Author: cwittich
Date: Fri Nov 24 13:46:14 2006
New Revision: 24820

URL: http://svn.reactos.org/svn/reactos?rev=24820&view=rev
Log:
-added cpl applet debugging support
-added naive target support (custom C::B version needed atm)
-handle linker options like baseaddress, entrypoint, stdlib and alignment
-use def files when linking dlls

Modified:
    trunk/reactos/tools/rbuild/backend/codeblocks/codeblocks.cpp
    trunk/reactos/tools/rbuild/backend/codeblocks/codeblocks.h

Modified: trunk/reactos/tools/rbuild/backend/codeblocks/codeblocks.cpp
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/rbuild/backend/codeblocks/codeblocks.cpp?rev=24820&r1=24819&r2=24820&view=diff
==============================================================================
--- trunk/reactos/tools/rbuild/backend/codeblocks/codeblocks.cpp (original)
+++ trunk/reactos/tools/rbuild/backend/codeblocks/codeblocks.cpp Fri Nov 24 13:46:14 2006
@@ -325,6 +325,9 @@
 	string module_type = GetExtension(module.GetTargetName());
 	string cbproj_path = module.GetBasePath();	
 	string CompilerVar;
+	string baseaddr;
+	string project_linker_flags = "-Wl,--enable-stdcall-fixup ";
+	project_linker_flags += GenerateProjectLinkerFlags();
 
 	bool lib = (module.type == ObjectLibrary) || (module.type == RpcClient) ||(module.type == RpcServer) || (module_type == ".lib") || (module_type == ".a");
 	bool dll = (module_type == ".dll") || (module_type == ".cpl");
@@ -417,6 +420,12 @@
 			vars.push_back( variables[i]->name );
 			values.push_back( variables[i]->value );
 		}*/
+		for ( i = 0; i < data.properties.size(); i++ )
+		{
+			Property& prop = *data.properties[i];
+			if ( strstr ( module.baseaddress.c_str(), prop.name.c_str() ) )
+				baseaddr = prop.value;
+		}
 	}
 
 	if ( !module.allowWarnings )
@@ -458,13 +467,13 @@
 		else if ( dll )		
 			fprintf ( OUT, "\t\t\t\t<Option type=\"3\" />\r\n" );
 		else if ( sys )
-			fprintf ( OUT, "\t\t\t\t<Option type=\"?\" />\r\n" ); /*FIXME*/
+			fprintf ( OUT, "\t\t\t\t<Option type=\"4\" />\r\n" );
 		else if ( exe )
 		{
 			if ( module.type == Kernel )
-				fprintf ( OUT, "\t\t\t\t<Option type=\"?\" />\r\n" ); /*FIXME*/
+				fprintf ( OUT, "\t\t\t\t<Option type=\"4\" />\r\n" );
 			else if ( module.type == NativeCUI )
-				fprintf ( OUT, "\t\t\t\t<Option type=\"?\" />\r\n" ); /*FIXME*/
+				fprintf ( OUT, "\t\t\t\t<Option type=\"4\" />\r\n" );
 			else if ( module.type == Win32CUI || module.type == Win32GUI || module.type == Win32SCR)
 			{
 				if ( console )
@@ -474,8 +483,16 @@
 			}
 		}
 		
-			
 		fprintf ( OUT, "\t\t\t\t<Option compiler=\"gcc\" />\r\n" );
+		if ( module_type == ".cpl" )
+		{
+			if ( configuration.UseConfigurationInPath )
+				fprintf ( OUT, "\t\t\t\t<Option parameters=\"shell32,Control_RunDLL &quot;%s\\%s%s\\%s%s&quot;,@\" />\r\n", outdir.c_str (), module.GetBasePath ().c_str (), cfg.name.c_str(), module.name.c_str(), module_type.c_str() );
+			else
+				fprintf ( OUT, "\t\t\t\t<Option parameters=\"shell32,Control_RunDLL &quot;%s\\%s\\%s%s&quot;,@\" />\r\n",  outdir.c_str (), module.GetBasePath ().c_str (), module.name.c_str(), module_type.c_str() );
+
+			fprintf ( OUT, "\t\t\t\t<Option host_application=\"rundll32.exe\" />\r\n" );
+		}
 		fprintf ( OUT, "\t\t\t\t<Compiler>\r\n" );
 		
 		bool debug = ( cfg.optimization == Debug );
@@ -512,9 +529,49 @@
 			fprintf ( OUT, "\t\t\t\t\t<Add directory=\"%s\" />\r\n", include.c_str() );
 		}
 		fprintf ( OUT, "\t\t\t\t</ResourceCompiler>\r\n" );
+		
+		fprintf ( OUT, "\t\t\t\t<Linker>\r\n" );
+		fprintf ( OUT, "\t\t\t\t\t<Add option=\"%s\" />\r\n", project_linker_flags.c_str() );
+
+		if ( sys )
+		{
+			fprintf ( OUT, "\t\t\t\t\t<Add option=\"-Wl,--entry,%s%s\" />\r\n", "_", module.GetEntryPoint(false) == "" ? "DriverEntry at 8" : module.GetEntryPoint(false).c_str ());
+			fprintf ( OUT, "\t\t\t\t\t<Add option=\"-Wl,--image-base,%s\" />\r\n", baseaddr == "" ? "0x10000" : baseaddr.c_str () );
+			fprintf ( OUT, "\t\t\t\t\t<Add option=\"-nostartfiles -nostdlib\" />\r\n" );
+		}
+		else if ( exe )
+		{
+			if ( module.type == Kernel )
+			{
+				fprintf ( OUT, "\t\t\t\t\t<Add option=\"-Wl,--entry,_KiSystemStartup\" />\r\n" );
+				fprintf ( OUT, "\t\t\t\t\t<Add option=\"-Wl,--image-base,%s\" />\r\n", baseaddr.c_str () );
+			}
+			else if ( module.type == NativeCUI )
+			{
+				fprintf ( OUT, "\t\t\t\t\t<Add option=\"-Wl,--entry,_NtProcessStartup at 4\" />\r\n" );
+				fprintf ( OUT, "\t\t\t\t\t<Add option=\"-Wl,--image-base,%s\" />\r\n", baseaddr.c_str () );
+				fprintf ( OUT, "\t\t\t\t\t<Add option=\"-nostartfiles -nostdlib\" />\r\n" );
+			}
+			else
+			{
+				fprintf ( OUT, "\t\t\t\t\t<Add option=\"%s\" />\r\n", module.useHostStdlib ? "-nostartfiles -lgcc" : "-nostartfiles -nostdlib -lgcc" );
+			}
+		}
+		else if ( dll )
+		{
+			fprintf ( OUT, "\t\t\t\t\t<Add option=\"-Wl,--entry,%s%s\" />\r\n", "_", module.GetEntryPoint(false).c_str () );
+			fprintf ( OUT, "\t\t\t\t\t<Add option=\"-Wl,--image-base,%s\" />\r\n", baseaddr == "" ? "0x40000" : baseaddr.c_str () );
+			fprintf ( OUT, "\t\t\t\t\t<Add option=\"%s\" />\r\n", module.useHostStdlib ? "-nostartfiles -lgcc" : "-nostartfiles -nostdlib -lgcc" );
+		}
+
+		fprintf ( OUT, "\t\t\t\t\t<Add option=\"-Wl,--file-alignment,0x1000\" />\r\n" );
+		fprintf ( OUT, "\t\t\t\t\t<Add option=\"-Wl,--section-alignment,0x1000\" />\r\n" );
+
+		if ( dll )
+			fprintf ( OUT, "\t\t\t\t\t<Add option=\"%s.temp.exp\" />\r\n", module.name.c_str() );
+			
 
 		/* libraries */
-		fprintf ( OUT, "\t\t\t\t<Linker>\r\n" );
 		for ( i = 0; i < libraries.size(); i++ )
 		{
 			const string& lib = libraries[i];
@@ -526,6 +583,20 @@
 			fprintf ( OUT, "\t\t\t\t\t<Add directory=\"%s\" />\r\n", lib.c_str() );
 		}
 		fprintf ( OUT, "\t\t\t\t</Linker>\r\n" );
+
+		if ( dll )
+		{
+			fprintf ( OUT, "\t\t\t\t<ExtraCommands>\r\n" );
+			fprintf ( OUT, "<Add before=\"dlltool --dllname %s.%s --def %s.def --output-exp %s.temp.exp --kill-at\" />\r\n", module.name.c_str(), module_type.c_str(), module.name.c_str(), module.name.c_str() );
+#ifdef WIN32
+			fprintf ( OUT, "\t\t\t\t\t<Add after=\"cmd /c del %s.temp.exp 2&gt;NUL\" />\r\n", module.name.c_str() );
+#else
+			fprintf ( OUT, "\t\t\t\t\t<Add after=\"rm %s.temp.exp 2&gt;/dev/null\" />\r\n", module.name.c_str() );
+#endif
+			fprintf ( OUT, "\t\t\t\t\t<Mode after=\"always\" />\r\n" );
+
+			fprintf ( OUT, "\t\t\t\t</ExtraCommands>\r\n" );
+		}
 
 		fprintf ( OUT, "\t\t\t</Target>\r\n" );
 
@@ -631,3 +702,16 @@
 	return string1;
 }
 
+std::string
+CBBackend::GenerateProjectLinkerFlags() const
+{
+	std::string lflags;
+	for ( size_t i = 0; i < ProjectNode.linkerFlags.size (); i++ )
+	{
+		LinkerFlag& linkerFlag = *ProjectNode.linkerFlags[i];
+		if ( lflags.length () > 0 )
+			lflags += " ";
+		lflags += linkerFlag.flag;
+	}
+	return lflags;
+}

Modified: trunk/reactos/tools/rbuild/backend/codeblocks/codeblocks.h
URL: http://svn.reactos.org/svn/reactos/trunk/reactos/tools/rbuild/backend/codeblocks/codeblocks.h?rev=24820&r1=24819&r2=24820&view=diff
==============================================================================
--- trunk/reactos/tools/rbuild/backend/codeblocks/codeblocks.h (original)
+++ trunk/reactos/tools/rbuild/backend/codeblocks/codeblocks.h Fri Nov 24 13:46:14 2006
@@ -72,7 +72,7 @@
 		std::string CbpFileName ( const Module& module ) const;
 		std::string LayoutFileName ( const Module& module ) const;
 		std::string DependFileName ( const Module& module ) const;
-
+		std::string GenerateProjectLinkerFlags () const;
 		std::vector<CBConfiguration*> m_configurations;
 
 		std::vector<FileUnit> m_fileUnits;




More information about the Ros-diffs mailing list