def __CreateVariantOption(self, variant: PackagePlatformVariant, option: PackagePlatformVariantOption, isLibrary: bool, isFirstOption: bool) -> str: strContent = "" if isFirstOption: strContent += "ifeq ($(%s),%s)\n" % (variant.Name, option.Name) else: strContent += "else ifeq ($(%s),%s)\n" % (variant.Name, option.Name) if len(option.DirectDefines) > 0: defines = Util.ExtractNames(option.DirectDefines) strDefines = MakeFileHelper.CreateList(defines) strContent += "CPP_DEFINE_FLAG_NAMES+=%s\n\n" % (strDefines) if len(option.ExternalDependencies) > 0: includes = self.__ExtractInclude(option.ExternalDependencies) if len(includes) > 0: includes.reverse() # to make GCC happy strIncludes = MakeFileHelper.CreateList(includes) strContent += "INCLUDE_DIRS+=%s\n\n" % (strIncludes) if not isLibrary and len(option.ExternalDependencies) > 0: extLibraryDependencies = Util.ExtractNames( option.ExternalDependencies) extLibraryDependencies.reverse() # to make GCC happy strExtLibraryDependencies = MakeFileHelper.CreateList( extLibraryDependencies) strContent += "USER_EXTLIB_DEPS+=%s\n\n" % ( strExtLibraryDependencies) return strContent
def __GenerateBuildFile(self, config: Config, generatorName: str, package: Package, template: str, dstMakeFilename: str) -> None: if package.ShortName is None or package.Namespace is None or package.ResolvedMakeObjectPath is None or package.AbsolutePath is None: raise Exception("Invalid Package") name = GeneratorGNUmakefileUtil.GetTargetName(package) installPath = package.Namespace if package.Type == PackageType.Library: name = "lib" + name if package.ResolvedBuildSourceFiles is None or package.ResolvedBuildAllIncludeDirs is None or package.ResolvedBuildAllPrivateDefines is None or package.ResolvedBuildAllPublicDefines is None: raise Exception("Invalid Package") files = MakeFileHelper.CreateList(package.ResolvedBuildSourceFiles) includeDirs = MakeFileHelper.CreateList( package.ResolvedBuildAllIncludeDirs) localDefines = Util.ExtractNames( package.ResolvedBuildAllPrivateDefines) localDefines += Util.ExtractNames( package.ResolvedBuildAllPublicDefines) localDefineNames = MakeFileHelper.CreateList(localDefines) variantSection = self.__GetVariantSection(package) if package.ResolvedMakeVariantNameHint is None: raise InternalErrorException( "Package '{0}' ResolvedMakeVariantNameHint can not be None". format(package.Name)) variantName = package.ResolvedMakeVariantNameHint build = template build = build.replace("##PACKAGE_TARGET_NAME##", name) build = build.replace("##PACKAGE_TARGET_INSTALL_PATH##", installPath) build = build.replace("##PACKAGE_SOURCE_FILES##", files) build = build.replace("##PACKAGE_INCLUDE_DIRS##", includeDirs) build = build.replace("##PACKAGE_DEFINES##", localDefineNames) build = build.replace("##PACKAGE_VARIANT_SECTION##", variantSection) build = build.replace("##PACKAGE_OBJECT_PATH##", package.ResolvedMakeObjectPath) build = build.replace("##PACKAGE_VARIANT_NAME##", variantName) if package.Type == PackageType.Executable: libraryDependencies = self.__GetLibraryDependencies( config, package) strLibraryDependencies = MakeFileHelper.CreateList( libraryDependencies) build = build.replace("##PACKAGE_LIBRARY_DEPENDENCIES##", strLibraryDependencies) extLibraryDependencies = self.__GetExternalLibraryDependencies( package) strExtLibraryDependencies = MakeFileHelper.CreateList( extLibraryDependencies) build = build.replace("##PACKAGE_EXTERNAL_LIBRARY_DEPENDENCIES##", strExtLibraryDependencies) extLibraryPaths = self.__GetExternalLibraryPaths( package, [ExternalDependencyType.StaticLib, ExternalDependencyType.DLL]) strExtLibraryPaths = MakeFileHelper.CreateList(extLibraryPaths) build = build.replace("##PACKAGE_EXTERNAL_LIBRARY_PATHS##", strExtLibraryPaths) extDllPaths = self.__GetExternalLibraryPaths( package, [ExternalDependencyType.DLL]) strExtDllPaths = MakeFileHelper.CreateList(extDllPaths) build = build.replace("##PACKAGE_EXTERNAL_DLL_PATHS##", strExtDllPaths) executableReport = GeneratorGNUmakefileUtil.TryGenerateExecutableReport( config, generatorName, package) if executableReport is not None: variableReport = GeneratorGNUmakefileUtil.GenerateVariableReport( config, generatorName, package, self.ConfigVariantOptions) GitIgnoreHelper.AddFromBuildReport(self.GitIgnoreDict, package, executableReport, variableReport) dstFile = IOUtil.Join(package.AbsolutePath, dstMakeFilename) if not config.DisableWrite: IOUtil.WriteFileIfChanged(dstFile, build) GitIgnoreHelper.AddPathIfInPackageRoot(self.GitIgnoreDict, package, dstFile)
def __GenerateFolderStructure(self, config: Config, package: Package) -> None: #don't generate anything for unsuported packages if package.ResolvedPlatformNotSupported: return if (package.AbsolutePath is None or package.ResolvedBuildPath is None or package.ResolvedBuildAllIncludeDirs is None or package.ResolvedBuildSourceFiles is None or package.ShortName is None): raise Exception("Invalid package") # Use a standard build path buildBasePath = IOUtil.Join(package.AbsolutePath, package.ResolvedBuildPath) newDir = "arm" relativePathBuildArm = IOUtil.Join(package.ResolvedBuildPath, newDir) buildArmPath = IOUtil.Join(buildBasePath, newDir) buildPath = buildBasePath #relativePathBuild = "" newDir = "a-le-v7" relativePathBuildLib = IOUtil.Join(relativePathBuildArm, newDir) buildPathLib = IOUtil.Join(buildArmPath, newDir) #check package type and prepare folder name if package.Type == PackageType.Library: relativePathBuild = relativePathBuildLib buildPath = buildPathLib elif package.Type == PackageType.Executable: newDir = "o-le-v7" relativePathBuild = IOUtil.Join(relativePathBuildArm, newDir) buildPath = IOUtil.Join(buildArmPath, newDir) else: raise InternalErrorException("Unknown package type: {0}".format(package.Name)) if not config.DisableWrite: # create folder structure IOUtil.SafeMakeDirs(buildPath) #copy make files that are not modified IOUtil.CopySmallFile(IOUtil.Join(config.SDKConfigTemplatePath, ".qnx_internal.mk"), IOUtil.Join(buildBasePath, ".qnx_internal.mk")) dstFile = IOUtil.Join(buildBasePath, "Makefile") content = self.TemplateMakefileCPU IOUtil.WriteFileIfChanged(dstFile, content) dstFile = IOUtil.Join(buildArmPath, "Makefile") content = self.TemplateMakefileVariant IOUtil.WriteFileIfChanged(dstFile, content) dstFile = IOUtil.Join(buildPath, "Makefile") content = self.TemplateMakefileTop IOUtil.WriteFileIfChanged(dstFile, content) #create common.mk with package-specific content dstFile = IOUtil.Join(buildBasePath, "common.mk") content = self.TemplateCommonMk #add "$(project_root)/" to local includes like "include", keep others as they are ("$(FSL_GRAPHICS_SDK)/a/b/") updatedIncludedirs = [] for includeDir in package.ResolvedBuildAllIncludeDirs: if not os.path.dirname(includeDir): updatedIncludedirs.append("$(project_root)/" + includeDir) else: updatedIncludedirs.append(includeDir) includes = self.__FormatListToString("EXTRA_INCVPATH += ", updatedIncludedirs) content = content.replace("##EXTRA_INCVPATHS##", includes) srcDirsList = self.__ExtractUniqueDirectoriesFromList(package.ResolvedBuildSourceFiles) srcDirs = self.__FormatListToString("EXTRA_SRCVPATH += $(project_root)/", srcDirsList) content = content.replace("##EXTRA_SRCVPATHS##", srcDirs) # QNX takes all sources in folder, just like this generator, so there is no need to # list all files in makefile. #sourceObjs = [] #for sourceFile in package.ResolvedBuildSourceFiles: # sourceObjs.append(os.path.splitext(sourceFile)[0] + ".o") #sourceObjsString = self.__FormatListToString("SOURCE_OBJECTS += $(project_root)/", sourceObjs) #content = content.replace("##EXTRA_SOURCE_OBJS##", sourceObjsString) content = content.replace("##EXTRA_SOURCE_OBJS##", "") libDirsList = self.__GetStaticLibsPaths(config, package, relativePathBuildLib) extLibraryDependencies = self.__GetExternalLibraryDependencies(package) libsExtern = "" for lib in extLibraryDependencies: libsExtern = libsExtern + lib[0] + " " if lib[1] is not None and lib[1] not in libDirsList: libDirsList.append(lib[1]) if libsExtern: libsExtern = "LIBS += " + libsExtern + "\n" content = content.replace("##PACKAGE_EXTERNAL_LIBRARY_DEPENDENCIES##", libsExtern) libDirs = self.__FormatListToString("EXTRA_LIBVPATH += ", libDirsList) content = content.replace("##EXTRA_LIBVPATHS##", libDirs) sl = self.__GetStaticLibs(package) content = content.replace("##STATIC_LIBS##", sl) name = package.ShortName if package.Type == PackageType.Executable else package.Name content = content.replace("##PINFO_DESC##", name) content = content.replace("##NAME##", name) # Local CPP defines localDefines = Util.ExtractNames(package.ResolvedBuildAllPrivateDefines) localDefines += Util.ExtractNames(package.ResolvedBuildAllPublicDefines) localDefineNames = MakeFileHelper.CreateList(localDefines) content = content.replace("##PACKAGE_DEFINES##", localDefineNames) #if package.Type == PackageType.Executable: #libraryDependencies = self.__GetLibraryDependencies(config, package) #libraryDependencies = MakeFileHelper.CreateList(libraryDependencies) #build = build.replace("##PACKAGE_LIBRARY_DEPENDENCIES##", libraryDependencies) if not config.DisableWrite: IOUtil.WriteFileIfChanged(dstFile, content) #remove this if statement if build scripts are required also for libraries if package.Type == PackageType.Executable: self.__GenerateBuildScript(config, package, self.BldTemplate, buildBasePath)