+ makefile = open(os.path.join(const.DATA_DIR, "mktemplates/template.mk"), "r").read()
+ prjdir = os.path.abspath(project_info.prjdir)
+ destination = os.path.join(prjdir, os.path.basename(prjdir) + ".mk")
+ mk_data = {}
+ mk_data["$pname"] = project_info.info("PROJECT_NAME")
+ mk_data["$ppath"] = project_info.info("PROJECT_SRC_PATH_FROM_MAKEFILE")
+ mk_data["$cpuclockfreq"] = project_info.info("SELECTED_FREQ")
+ cpu_mk_parameters = []
+ for key, value in project_info.info("CPU_INFOS").items():
+ if key.startswith(const.MK_PARAM_ID):
+ cpu_mk_parameters.append("%s = %s" %(key.replace("MK", mk_data["$pname"]), value))
+ mk_data["$cpuparameters"] = "\n".join(cpu_mk_parameters)
+ mk_data["$csrc"], mk_data["$pcsrc"], mk_data["$cppasrc"], mk_data["$cxxsrc"], mk_data["$asrc"], mk_data["$constants"] = csrcGenerator(project_info)
+ mk_data["$prefix"] = replaceSeparators(project_info.info("TOOLCHAIN")["path"].rsplit("gcc", 1)[0])
+ mk_data["$suffix"] = replaceSeparators(project_info.info("TOOLCHAIN")["path"].rsplit("gcc", 1)[1])
+ mk_data["$hwpath"] = project_info.info("PROJECT_HW_PATH_FROM_MAKEFILE")
+ for key in mk_data:
+ makefile = makefile.replace(key, mk_data[key])
+ open(destination, "w").write(makefile)
+
+def makefileGenerator(project_info):
+ """
+ Generate the Makefile for the current project.
+ """
+ makefile = open(os.path.join(const.DATA_DIR, "mktemplates/Makefile"), "r").read()
+ destination = os.path.join(project_info.maindir, "Makefile")
+ # TODO write a general function that works for both the mk file and the Makefile
+ mk_data = {}
+ mk_data["$pname"] = project_info.info("PROJECT_NAME")
+ mk_data["$ppath"] = project_info.info("PROJECT_SRC_PATH_FROM_MAKEFILE")
+ for key in mk_data:
+ makefile = makefile.replace(key, mk_data[key])
+ open(destination, "w").write(makefile)
+
+def csrcGenerator(project_info):
+ modules = project_info.info("MODULES")
+ files = project_info.info("FILES")
+ if "harvard" in project_info.info("CPU_INFOS")["CPU_TAGS"]:
+ harvard = True
+ else:
+ harvard = False
+ # file to be included in CSRC variable
+ csrc = []
+ # file to be included in PCSRC variable
+ pcsrc = []
+ # files to be included in CPPASRC variable
+ cppasrc = []
+ # files to be included in CXXSRC variable
+ cxxsrc = []
+ # files to be included in ASRC variable
+ asrc = []
+ # constants to be included at the beginning of the makefile
+ constants = {}
+ for module, information in modules.items():
+ module_files = set([])
+ dependency_files = set([])
+ # assembly sources
+ asm_files = set([])
+ hwdir = os.path.basename(project_info.info("PROJECT_PATH")) + "/hw"
+ if information["enabled"]:
+ if "constants" in information:
+ constants.update(information["constants"])
+ cfiles, sfiles = findModuleFiles(module, project_info)
+ module_files |= set(cfiles)
+ asm_files |= set(sfiles)
+ for file in information["hw"]:
+ if file.endswith(".c"):
+ module_files |= set([hwdir + "/" + os.path.basename(file)])
+ for file_dependency in information["depends"] + tuple(files.keys()):
+ dependencyCFiles, dependencySFiles = findModuleFiles(file_dependency, project_info)
+ dependency_files |= set(dependencyCFiles)
+ asm_files |= set(dependencySFiles)
+ for file in module_files:
+ if not harvard or information.get("harvard", "both") == "both":
+ csrc.append(file)
+ if harvard and "harvard" in information:
+ pcsrc.append(file)
+ for file in dependency_files:
+ csrc.append(file)
+ for file in project_info.info("CPU_INFOS")["C_SRC"]:
+ csrc.append(file)
+ for file in project_info.info("CPU_INFOS")["PC_SRC"]:
+ pcsrc.append(file)
+ for file in asm_files:
+ cppasrc.append(file)
+ for file in project_info.info("CPU_INFOS")["CPPA_SRC"]:
+ cppasrc.append(file)
+ for file in project_info.info("CPU_INFOS")["CXX_SRC"]:
+ cxxsrc.append(file)
+ for file in project_info.info("CPU_INFOS")["ASRC"]:
+ asrc.append(file)
+ csrc = sorted(set(csrc))
+ csrc = " \\\n\t".join(csrc) + " \\"
+ pcsrc = sorted(set(pcsrc))
+ pcsrc = " \\\n\t".join(pcsrc) + " \\"
+ cppasrc = sorted(set(cppasrc))
+ cppasrc = " \\\n\t".join(cppasrc) + " \\"
+ cxxsrc = sorted(set(cxxsrc))
+ cxxsrc = " \\\n\t".join(cxxsrc) + " \\"
+ asrc = sorted(set(asrc))
+ asrc = " \\\n\t".join(asrc) + " \\"
+ constants = "\n".join([project_info.info("PROJECT_NAME") + "_" + key + " = " + unicode(value) for key, value in constants.items()])
+ return csrc, pcsrc, cppasrc, cxxsrc, asrc, constants
+
+def findModuleFiles(module, project_info):
+ # Find the files related to the selected module
+ cfiles = []
+ sfiles = []
+ # .c files related to the module and the cpu architecture
+ for filename, path in project_info.searchFiles(module + ".c"):
+ path = path.replace(project_info.info("BERTOS_PATH") + os.sep, "")
+ path = replaceSeparators(path)
+ cfiles.append(path + "/" + filename)
+ # .s files related to the module and the cpu architecture
+ for filename, path in project_info.searchFiles(module + ".s") + \
+ project_info.searchFiles(module + ".S"):
+ path = path.replace(project_info.info("BERTOS_PATH") + os.sep, "")
+ path = replaceSeparators(path)
+ sfiles.append(path + "/" + filename)
+ # .c and .s files related to the module and the cpu tags
+ tags = project_info.info("CPU_INFOS")["CPU_TAGS"]
+
+ # Awful, but secure check for version
+ # TODO: split me in a method/function
+ try:
+ version_string = bertosVersion(project_info.info("BERTOS_PATH"))
+ version_list = [int(i) for i in version_string.split()[1].split('.')]
+ except ValueError:
+ # If the version file hasn't a valid version number assume it's an older
+ # project.
+ version_list = [0, 0]
+ if version_list < [2, 5]:
+ # For older versions of BeRTOS add the toolchain to the tags
+ tags.append(project_info.info("CPU_INFOS")["TOOLCHAIN"])
+
+ for tag in tags:
+ for filename, path in project_info.searchFiles(module + "_" + tag + ".c"):
+ path = path.replace(project_info.info("BERTOS_PATH") + os.sep, "")
+ if os.sep != "/":
+ path = replaceSeparators(path)
+ cfiles.append(path + "/" + filename)
+ for filename, path in project_info.searchFiles(module + "_" + tag + ".s") + \
+ project_info.searchFiles(module + "_" + tag + ".S"):
+ path = path.replace(project_info.info("BERTOS_PATH") + os.sep, "")
+ path = replaceSeparators(path)
+ sfiles.append(path + "/" + filename)
+ return cfiles, sfiles
+
+def replaceSeparators(path):
+ """
+ Replace the separators in the given path with unix standard separator.
+ """
+ if os.sep != "/":
+ path = path.replace(os.sep, "/")
+ return path