Index: freebsd-to-rtems.py
===================================================================
--- freebsd-to-rtems.py	(revision 0d436c7f7dbd71e7c9c43bb7f6c85e2c7dabcd88)
+++ freebsd-to-rtems.py	(revision 9df96097b38a1d3bde191518bdf9dad59333fb3e)
@@ -49,4 +49,5 @@
 isOnlyMakefile = False
 tempFile = "/tmp/tmp_FBRT"
+filesChanged = 0
 
 def usage():
@@ -151,4 +152,19 @@
 	return path
 
+# Move target dependent files under a machine directory
+def mapCPUDependentPath(path):
+	return path.replace("include/", "include/freebsd/machine/")
+
+# compare and overwrite destination file only if different
+def copyIfDifferent(new, old):
+	global filesChanged
+	if not os.path.exists(old) or \
+           filecmp.cmp(new, old, shallow=False) == False:
+		shutil.move(new, old)
+		filesChanged += 1
+		# print "Move " + new + " to " + old
+		return True
+	return False
+
 # generate an empty file as a place holder
 def installEmptyFile(src):
@@ -186,19 +202,12 @@
 	return data
 
-# compare and overwrite destination file only if different
-def copyIfDifferent(new, old):
-	if filecmp.cmp(new, old, shallow=False) == False:
-		shutil.move(new, old)
-		# print "Move " + new + " to " + old
-		return True
-	return False
-	
-    
 # Copy a header file from FreeBSD to the RTEMS BSD tree
-def installHeaderFile(org):
+def installHeaderFile(org, target):
 	global tempFile
 	src = FreeBSD_DIR + '/' + org
 	dst = RTEMS_DIR + '/' + PREFIX + '/' + org # + org.replace('rtems/', '')
 	dst = mapContribPath(dst)
+	if target != "generic":
+		dst = mapCPUDependentPath(dst)
 	if isDryRun == True:
 		if isVerbose == True:
@@ -246,5 +255,5 @@
 
 # Revert a header file from the RTEMS BSD tree to the FreeBSD tree
-def revertHeaderFile(org):
+def revertHeaderFile(org, target):
 	src = RTEMS_DIR + '/' + PREFIX + '/' + org.replace('rtems/', '')
 	src = mapContribPath(src)
@@ -258,4 +267,7 @@
 	except OSError:
 		pass
+	if target != "generic":
+		print "Do not yet know how to revert target dependent files"
+		sys.exit(1)
 	data = open(src).read()
 	out = open(dst, 'w')
@@ -293,5 +305,6 @@
 		return
 	try:
-		shutil.rmtree(RTEMS_DIR)
+		print "Deleting output directory needs to be more precise"
+		#shutil.rmtree(RTEMS_DIR)
 	except OSError:
 	    pass
@@ -314,5 +327,5 @@
 		for m in self.modules:
 			for f in m.headerFiles:
-				installHeaderFile(f)
+				installHeaderFile(f, m.target)
 			for f in m.sourceFiles:
 				installSourceFile(f)
@@ -321,12 +334,13 @@
 		for m in self.modules:
 			for f in m.headerFiles:
-				revertHeaderFile(f)
+				revertHeaderFile(f, m.target)
 			for f in m.sourceFiles:
 				revertSourceFile(f)
 
 	def createMakefile(self):
-		if isVerbose == True:
-			print "Create Makefile"
+		global tempFile
 		if isDryRun == True:
+			if isVerbose == True:
+				print "Create Makefile"
 			return
 		data = 'include config.inc\n' \
@@ -339,4 +353,5 @@
 			'CFLAGS += -I . \n' \
 			'CFLAGS += -I rtemsbsd \n' \
+			'CFLAGS += -I freebsd/$(RTEMS_CPU)/include \n' \
 			'CFLAGS += -I contrib/altq \n' \
 			'CFLAGS += -I contrib/pf \n' \
@@ -347,13 +362,30 @@
 		data += 'C_FILES ='
 		for m in self.modules:
-			for f in m.sourceFiles:
-				f = PREFIX + '/' + f
-				f = mapContribPath(f)
-				data += ' \\\n\t' + f
+			if m.target == "generic":
+				for f in m.sourceFiles:
+					f = PREFIX + '/' + f
+					f = mapContribPath(f)
+					data += ' \\\n\t' + f
+		data += '\n'
+		data += '# RTEMS Project Owned Files\n'
+		data += 'C_FILES +='
 		for f in rtems_sourceFiles:
-			f = 'rtemsbsd/' + f
-			data += ' \\\n\t' + f
-
-		data += '\nC_O_FILES = $(C_FILES:%.c=%.o)\n' \
+			data += ' \\\n\trtemsbsd/' + f
+		data += '\n'
+		data += '\n'
+		for m in self.modules:
+			if m.target != "generic":
+				data += "ifeq ($(RTEMS_CPU)," + m.target + ")\n"
+				data += "C_FILES +="
+				for f in m.sourceFiles:
+					f = PREFIX + '/' + f
+					f = mapContribPath(f)
+					data += ' \\\n\t' + f
+				data += '\n'
+				data += 'endif\n'
+			
+
+		data += '\n' \
+			'C_O_FILES = $(C_FILES:%.c=%.o)\n' \
 			'C_DEP_FILES = $(C_FILES:%.c=%.dep)\n' \
 			'\n' \
@@ -381,7 +413,11 @@
 			'\n' \
 			'-include $(C_DEP_FILES)\n'
-		out = open(RTEMS_DIR + '/Makefile', 'w')
+		out = open(tempFile, 'w')
 		out.write(data)
 		out.close()
+		makefile = RTEMS_DIR + '/Makefile'
+		if copyIfDifferent(tempFile, makefile) == True:
+			if isVerbose == True:
+				print "Create Makefile"
 
 # Module - logical group of related files we can perform actions on
@@ -389,8 +425,12 @@
 	def __init__(self, name):
 		self.name = name
+		self.target = "generic"
 		self.headerFiles = []
 		self.sourceFiles = []
 		self.dependencies = []
 
+	def setTarget(self, value):
+		self.target = value
+		
 	def addHeaderFiles(self, files):
 		self.headerFiles.extend(files)
@@ -404,5 +444,6 @@
 		self.sourceFiles.extend(files)
 		for file in files:
-			if file[-2] != '.' or file[-1] != 'c':
+			if file[-2] != '.' or \
+			   (file[-1] != 'c' and file[-1] != 'S'):
 				print "*** " + file + " does not end in .c"
 				print "*** Move it to a header file list"
@@ -418,5 +459,4 @@
 
 rtems_headerFiles = [
-	'rtems/machine/in_cksum.h',  # logically a net file
 	'rtems/machine/atomic.h',
         'rtems/machine/_bus.h',
@@ -997,5 +1037,4 @@
 		'kern/kern_mbuf.c',
 		'kern/kern_module.c',
-		'kern/kern_subr.c',
 		'kern/kern_sysctl.c',
 		'kern/subr_bus.c',
@@ -1060,5 +1099,4 @@
 
 netDeps = Module('netDeps')
-# logically machine/in_cksum.h is part of this group but RTEMS provides its own
 netDeps.addHeaderFiles(
 	[
@@ -1148,4 +1186,5 @@
 net.addSourceFiles(
 	[
+		'kern/kern_subr.c',
 		'net/bridgestp.c',
 		'net/ieee8023ad_lacp.c',
@@ -1272,4 +1311,5 @@
 	]
 )
+# in_cksum.c is architecture dependent
 netinet.addSourceFiles(
 	[
@@ -1281,5 +1321,4 @@
 		'netinet/igmp.c',
 		'netinet/in.c',
-		'netinet/in_cksum.c',
 		'netinet/in_gif.c',
 		'netinet/in_mcast.c',
@@ -1640,4 +1679,5 @@
 )
 
+# contrib/pf Module
 pf = Module('pf')
 pf.addHeaderFiles(
@@ -1665,4 +1705,76 @@
 )
 
+# ARM Architecture Specific Files Module
+armDependent = Module('armDependent')
+armDependent.setTarget("arm")
+armDependent.addHeaderFiles(
+	[
+		'arm/include/in_cksum.h',
+	]
+)
+armDependent.addSourceFiles(
+	[
+		'arm/arm/in_cksum.c',
+		'arm/arm/in_cksum_arm.S',
+	]
+)
+
+# i386 Architecture Specific Files Module
+i386Dependent = Module('i386Dependent')
+i386Dependent.setTarget("i386")
+i386Dependent.addHeaderFiles(
+	[
+		'i386/include/in_cksum.h',
+	]
+)
+i386Dependent.addSourceFiles(
+	[
+		'i386/i386/in_cksum.c',
+	]
+)
+
+# MIPS Architecture Specific Files Module
+mipsDependent = Module('mipsDependent')
+mipsDependent.setTarget("mips")
+mipsDependent.addHeaderFiles(
+	[
+		'mips/include/in_cksum.h',
+	]
+)
+mipsDependent.addSourceFiles(
+	[
+		'mips/mips/in_cksum.c',
+	]
+)
+
+# PowerPC Architecture Specific Files Module
+powerpcDependent = Module('powerpcDependent')
+powerpcDependent.setTarget("powerpc")
+powerpcDependent.addHeaderFiles(
+	[
+		'powerpc/include/in_cksum.h',
+	]
+)
+powerpcDependent.addSourceFiles(
+	[
+		'powerpc/powerpc/in_cksum.c',
+	]
+)
+
+# SPARC64 Architecture Specific Files Module
+sparc64Dependent = Module('cpu_dependent')
+sparc64Dependent.setTarget("powerpc")
+sparc64Dependent.addHeaderFiles(
+	[
+		'sparc64/include/in_cksum.h',
+	]
+)
+sparc64Dependent.addSourceFiles(
+	[
+		'sparc64/sparc64/in_cksum.c',
+	]
+)
+
+# Add Empty Files
 mm.addEmptyFiles(
 	[
@@ -1732,5 +1844,4 @@
 mm.addModule(devNet)
 
-# mm.addModule(rtems)
 mm.addModule(local)
 mm.addModule(devUsbBase)
@@ -1741,6 +1852,12 @@
 mm.addModule(cam)
 mm.addModule(devUsbStorage)
-
 #mm.addModule(devUsbNet)
+
+# Now add CPU Architecture Dependent Modules
+#mm.addModule(armDependent)
+#mm.addModule(i386Dependent)
+#mm.addModule(mipsDependent)
+mm.addModule(powerpcDependent)
+#mm.addModule(sparc64Dependent)
 
 # Perform the actual file manipulation
@@ -1752,2 +1869,6 @@
     mm.revertFiles()
 
+if filesChanged == 1:
+    print str(filesChanged) + " file was changed."
+else:
+    print str(filesChanged) + " files were changed."
