2
0
Эх сурвалжийг харах

Improved support for different assemblers. (#128)

Added module info ASM_OPTS options.
Inline pragmas are now available to imported files.
Brucey 1 жил өмнө
parent
commit
e732d7e8a0
6 өөрчлөгдсөн 86 нэмэгдсэн , 11 устгасан
  1. 5 0
      CHANGELOG
  2. 8 1
      bmk_make.bmx
  3. 4 0
      bmk_modutil.bmx
  4. 14 2
      bmk_util.bmx
  5. 54 7
      make.bmk
  6. 1 1
      version.bmx

+ 5 - 0
CHANGELOG

@@ -1,3 +1,8 @@
+## [3.55] - 2023-08-19
+### Added
+ - Added support for different assemblers.
+ - Include inline bmk directives in .i files.
+
 ## [3.54] - 2023-05-22
 ### Added
  - Cross-compile improvements.

+ 8 - 1
bmk_make.bmx

@@ -7,12 +7,14 @@ Global cc_opts$
 Global bcc_opts$
 Global cpp_opts$
 Global c_opts$
+Global asm_opts:String
 
 Function BeginMake()
 	cc_opts=Null
 	cpp_opts=Null
 	c_opts=Null
 	bcc_opts=Null
+	asm_opts=Null
 	app_main=Null
 	opt_framework=""
 End Function
@@ -766,7 +768,7 @@ Type TBuildManager Extends TCallback
 							If m.path.EndsWith(".cpp") Or m.path.EndsWith(".cc") Or m.path.EndsWith(".mm") Or m.path.EndsWith(".cxx") Then
 								CompileC m.path, m.obj_path, m.GetIncludePaths() + " " + m.cc_opts + " " + m.cpp_opts
 							ElseIf m.path.EndsWith(".S") Or m.path.EndsWith("asm") Then
-								AssembleNative m.path, m.obj_path
+								AssembleNative m.path, m.obj_path, m.asm_opts
 							Else
 								CompileC m.path, m.obj_path, m.GetIncludePaths() + " " + m.cc_opts + " " + m.c_opts
 							End If
@@ -931,6 +933,7 @@ Type TBuildManager Extends TCallback
 							s.cc_opts :+ source.cc_opts
 							s.cpp_opts :+ source.cpp_opts
 							s.c_opts :+ source.c_opts
+							s.asm_opts :+ source.asm_opts
 							s.CopyIncludePaths(source.includePaths)
 							
 							CalculateDependencies(s, isMod, rebuildImports)
@@ -965,6 +968,7 @@ Type TBuildManager Extends TCallback
 							s.cc_opts = source.cc_opts
 							s.cpp_opts = source.cpp_opts
 							s.c_opts = source.c_opts
+							s.asm_opts = source.asm_opts
 							s.CopyIncludePaths(source.includePaths)
 							
 							source.deps.Insert(s.GetSourcePath(), s)
@@ -1088,6 +1092,7 @@ Type TBuildManager Extends TCallback
 						s.cc_opts = source.cc_opts
 						s.cpp_opts = source.cpp_opts
 						s.c_opts = source.c_opts
+						s.asm_opts = source.asm_opts
 						s.CopyIncludePaths(source.includePaths)
 					End If
 				Next
@@ -1320,10 +1325,12 @@ Type TBuildManager Extends TCallback
 				source.cc_opts :+ source.mod_opts.cc_opts
 				source.cpp_opts :+ source.mod_opts.cpp_opts
 				source.c_opts :+ source.mod_opts.c_opts
+				source.asm_opts :+ source.mod_opts.asm_opts
 			End If
 			source.cc_opts :+ cc_opts
 			source.cpp_opts :+ cpp_opts
 			source.c_opts :+ c_opts
+			source.asm_opts :+ asm_opts
 	
 			' Module BCC opts
 			Local sb:TStringBuffer = New TStringBuffer

+ 4 - 0
bmk_modutil.bmx

@@ -69,6 +69,7 @@ Type TSourceFile
 	Field bcc_opts:String
 	Field cpp_opts:String
 	Field c_opts:String
+	Field asm_opts:String
 	
 	Field mod_opts:TModOpt
 	Field includePaths:TOrderedMap = New TOrderedMap
@@ -376,6 +377,7 @@ Type TSourceFile
 		source.merge_time = merge_time
 		source.cpp_opts = cpp_opts
 		source.c_opts = c_opts
+		source.asm_opts = asm_opts
 		source.CopyIncludePaths(includePaths)
 		source.maxLinkTimeCache = maxLinkTimeCache
 		source.maxIfaceTimeCache = maxIfaceTimeCache
@@ -632,6 +634,8 @@ Function ParseISourceFile:TSourceFile( path$ )
 				file.AddModOpt(qval) ' bmk2
 				'If mod_opts mod_opts.addOption(qval) ' BaH
 			EndIf
+		case "#pragma"
+			file.pragmas.AddLast val
 		End Select
 
 	Wend

+ 14 - 2
bmk_util.bmx

@@ -16,6 +16,7 @@ Type TModOpt ' BaH
 	Field ld_opts:TList = New TList
 	Field cpp_opts:String = ""
 	Field c_opts:String = ""
+	Field asm_opts:String = ""
 	
 	Method addOption(qval:String, path:String)
 		If qval.startswith("CC_OPTS") Then
@@ -24,6 +25,8 @@ Type TModOpt ' BaH
 			cpp_opts:+ " " + setPath(ReQuote(qval[qval.find(":") + 1..].Trim()), path)
 		ElseIf qval.startswith("C_OPTS") Then
 			c_opts:+ " " + setPath(ReQuote(qval[qval.find(":") + 1..].Trim()), path)
+		ElseIf qval.startswith("ASM_OPTS") Then
+			asm_opts:+ " " + setPath(ReQuote(qval[qval.find(":") + 1..].Trim()), path)
 		ElseIf qval.startswith("LD_OPTS") Then
 			Local opt:String = ReQuote(qval[qval.find(":") + 1..].Trim())
 			
@@ -37,6 +40,8 @@ Type TModOpt ' BaH
 			setOption("cpp_opts", qval)
 		ElseIf qval.startswith("C_VOPT") Then
 			setOption("c_opts", qval)
+		ElseIf qval.startswith("ASM_VOPT") Then
+			setOption("asm_opts", qval)
 		ElseIf qval.startswith("LD_VOPT") Then
 			setOption("ld_opts", qval)
 		End If
@@ -62,6 +67,10 @@ Type TModOpt ' BaH
 		Return c_opts.find(value) >= 0
 	End Method
 
+	Method hasASMopt:Int(value:String)
+		Return asm_opts.find(value) >= 0
+	End Method
+
 	Method hasLDopt:Int(value:String)
 		For Local opt:String = EachIn ld_opts
 			If opt.find(value) >= 0 Then
@@ -73,6 +82,9 @@ Type TModOpt ' BaH
 
 	Function setPath:String(value:String, path:String)
 		If value.Contains("%PWD%") Then
+			If FileType(path) = FILETYPE_FILE Then
+				path = ExtractDir(path)
+			End If
 			Return value.Replace("%PWD%", path)
 		End If
 		
@@ -136,8 +148,8 @@ Function Assemble( src$,obj$ )
 	processor.RunCommand("assemble", [src, obj])
 End Function
 
-Function AssembleNative( src$, obj$ )
-	processor.RunCommand("assembleNative", [src, obj])
+Function AssembleNative( src$, obj$, opts:String )
+	processor.RunCommand("assembleNative", [src, obj, opts])
 End Function
 
 Function Fasm2As( src$,obj$ )

+ 54 - 7
make.bmk

@@ -41,17 +41,56 @@
 	local src = nvl(arg1, %infile%)
 	local obj = nvl(arg2, %outfile%)
 
-	cmd = "as"
+	local nativeAssembler = bmk.Option("native.assembler", "as")
+	local asmPath = bmk.Option(bmk.BuildName(nativeAssembler), nativeAssembler)
+
+	cmd = asmPath
 	
-	if bmk.Platform() == "win32" then
-		if bmk.CPU() == "x86" then
-			cmd = cmd .. " -arch i686"
-		else
-			cmd = cmd .. " -arch generic64"
+	if nativeAssembler == "as" then
+		if bmk.Platform() == "win32" then
+			if bmk.CPU() == "x86" then
+				cmd = cmd .. " -arch i686"
+			else
+				cmd = cmd .. " -arch generic64"
+			end
+		end
+
+		cmd = cmd .. " -W"
+	end
+
+	if nativeAssembler == "nasm" or nativeAssembler == "yasm" then
+		if bmk.Platform() == "win32" then
+			if bmk.CPU() == "x86" then
+				cmd = cmd .. " -f win32"
+			else
+				cmd = cmd .. " -f win64"
+			end
+		end
+
+		if bmk.Platform() == "linux" then
+			if bmk.CPU() == "x86" then
+				cmd = cmd .. " -f elf32"
+			else
+				cmd = cmd .. " -f elf64"
+			end
+		end
+
+		if bmk.Platform() == "macos" then
+			if bmk.CPU() == "x86" then
+				cmd = cmd .. " -f macho32"
+			else
+				cmd = cmd .. " -f macho64"
+			end
 		end
 	end
 	
-	cmd = cmd .. " -W -o " .. bmk.Quote(obj) .. " " .. bmk.Quote(src)
+	if nativeAssembler == "as" or nativeAssembler == "nasm" or nativeAssembler == "yasm" then
+		cmd = cmd .. " -o " .. bmk.Quote(obj) .. " " .. bmk.Quote(src)
+	end
+
+	if nativeAssembler == "fasm" then
+		cmd = cmd .. " " .. bmk.Quote(src) .. " " .. bmk.Quote(obj)
+	end
 
 	if bmk.MultiSys(cmd, src, obj, "") ~= 0 then
 		bmk.ThrowNew("Build Error: Failed to assemble " .. src)
@@ -349,11 +388,19 @@
 	end
 @end
 
+@define addasmopt
+	globals.AddOption("asm_opts", arg1, arg2)
+@end
+
 ## removes a cc_opt option
 @define rmccopt
 	globals.Remove("cc_opts", arg1)
 @end
 
+@define rmasmopt
+	globals.Remove("asm_opts", arg1)
+@end
+
 @define addldopt
 	globals.AddOption("ld_opts", arg1, arg2)
 @end

+ 1 - 1
version.bmx

@@ -1,3 +1,3 @@
 SuperStrict
 
-Const BMK_VERSION:String = "3.54"
+Const BMK_VERSION:String = "3.55"