summaryrefslogtreecommitdiffstats
path: root/Misc/README
Commit message (Expand)AuthorAgeFilesLines
* Merged revisions 75370-75372 via svnmerge fromGeorg Brandl2009-10-111-4/+12
* Merged revisions 70912,70944,70968,71033,71041,71208,71263,71286,71395-71396,...Benjamin Peterson2009-04-111-0/+1
* Remove support for BeOSSkip Montanaro2007-08-171-2/+0
* Add some doc about using valgrindNeal Norwitz2004-06-061-0/+2
* mention pymemcompat.h in Misc/READMEMichael W. Hudson2003-08-111-0/+1
* Note the existence of SpecialBuilds.txt.Guido van Rossum2002-07-111-0/+1
* Remove stub for unicode.txt. Resort README in dictionary order.Guido van Rossum2002-02-111-9/+8
* Updated this README to reality.Guido van Rossum2001-10-261-15/+6
* Removed NEXT-NOTES, the NeXT is no longer supported.Jack Jansen2001-08-191-1/+0
* Updated to include all files here.Guido van Rossum2000-09-011-3/+7
* # mention Porting in list of filesGuido van Rossum1998-08-101-0/+1
* delete gMakefile, clarify Makefile.pre.inGuido van Rossum1998-01-131-2/+1
* Added vgrindefs.Guido van Rossum1997-11-071-0/+1
* Removed ancient FAQ from distributionGuido van Rossum1997-08-181-1/+1
* Added editline fixGuido van Rossum1996-09-121-0/+1
* Added Makefile.pre.in, my generic makefileGuido van Rossum1996-09-101-0/+1
* Minor updates.Guido van Rossum1996-08-201-6/+6
* updatesGuido van Rossum1995-08-281-3/+3
* Some new files...Guido van Rossum1994-09-141-1/+5
* FAQ: Added lambda stress test by UlfGuido van Rossum1994-08-301-1/+1
* Added cheatsheetGuido van Rossum1994-08-051-0/+1
* Descripbe new filesGuido van Rossum1994-01-261-2/+10
* Initial revisionGuido van Rossum1994-01-261-0/+20
">static bool cmLinkItemValidForDevice(std::string const& item) { // Valid items are: // * Non-flags (does not start in '-') // * Specific flags --library, --library-path, -l, -L // For example: // * 'cublas_device' => pass-along // * '--library pthread' => pass-along // * '-lpthread' => pass-along // * '-pthread' => drop // * '-a' => drop // * '-framework Name' (as one string) => drop return (!cmHasLiteralPrefix(item, "-") || // cmHasLiteralPrefix(item, "-l") || // cmHasLiteralPrefix(item, "-L") || // cmHasLiteralPrefix(item, "--library")); } bool cmLinkLineDeviceComputer::ComputeRequiresDeviceLinking( cmComputeLinkInformation& cli) { // Determine if this item might requires device linking. // For this we only consider targets using ItemVector = cmComputeLinkInformation::ItemVector; ItemVector const& items = cli.GetItems(); std::string config = cli.GetConfig(); for (auto const& item : items) { if (item.Target && item.Target->GetType() == cmStateEnums::STATIC_LIBRARY) { if ((!item.Target->GetPropertyAsBool("CUDA_RESOLVE_DEVICE_SYMBOLS")) && item.Target->GetPropertyAsBool("CUDA_SEPARABLE_COMPILATION")) { // this dependency requires us to device link it return true; } } } return false; } void cmLinkLineDeviceComputer::ComputeLinkLibraries( cmComputeLinkInformation& cli, std::string const& stdLibString, std::vector<BT<std::string>>& linkLibraries) { // Generate the unique set of link items when device linking. // The nvcc device linker is designed so that each static library // with device symbols only needs to be listed once as it doesn't // care about link order. std::set<std::string> emitted; using ItemVector = cmComputeLinkInformation::ItemVector; ItemVector const& items = cli.GetItems(); std::string config = cli.GetConfig(); bool skipItemAfterFramework = false; // Note: // Any modification of this algorithm should be reflected also in // cmVisualStudio10TargetGenerator::ComputeCudaLinkOptions for (auto const& item : items) { if (skipItemAfterFramework) { skipItemAfterFramework = false; continue; } if (item.Target) { bool skip = false; switch (item.Target->GetType()) { case cmStateEnums::SHARED_LIBRARY: case cmStateEnums::MODULE_LIBRARY: case cmStateEnums::INTERFACE_LIBRARY: skip = true; break; case cmStateEnums::STATIC_LIBRARY: skip = item.Target->GetPropertyAsBool("CUDA_RESOLVE_DEVICE_SYMBOLS"); break; default: break; } if (skip) { continue; } } BT<std::string> linkLib; if (item.IsPath) { // nvcc understands absolute paths to libraries ending in '.a' or '.lib'. // These should be passed to nvlink. Other extensions need to be left // out because nvlink may not understand or need them. Even though it // can tolerate '.so' or '.dylib' it cannot tolerate '.so.1'. if (cmHasLiteralSuffix(item.Value.Value, ".a") || cmHasLiteralSuffix(item.Value.Value, ".lib")) { linkLib.Value += this->ConvertToOutputFormat( this->ConvertToLinkReference(item.Value.Value)); } } else if (item.Value == "-framework") { // This is the first part of '-framework Name' where the framework // name is specified as a following item. Ignore both. skipItemAfterFramework = true; continue; } else if (cmLinkItemValidForDevice(item.Value.Value)) { linkLib.Value += item.Value.Value; } if (emitted.insert(linkLib.Value).second) { linkLib.Value += " "; const cmLinkImplementation* linkImpl = cli.GetTarget()->GetLinkImplementation(cli.GetConfig()); for (const cmLinkImplItem& iter : linkImpl->Libraries) { if (iter.Target != nullptr && iter.Target->GetType() != cmStateEnums::INTERFACE_LIBRARY) { std::string libPath = iter.Target->GetLocation(cli.GetConfig()); if (item.Value == libPath) { linkLib.Backtrace = iter.Backtrace; break; } } } linkLibraries.emplace_back(linkLib); } } if (!stdLibString.empty()) { linkLibraries.emplace_back(cmStrCat(stdLibString, ' ')); } } std::string cmLinkLineDeviceComputer::GetLinkerLanguage(cmGeneratorTarget*, std::string const&) { return "CUDA"; } bool requireDeviceLinking(cmGeneratorTarget& target, cmLocalGenerator& lg, const std::string& config) { if (!target.GetGlobalGenerator()->GetLanguageEnabled("CUDA")) { return false; } if (target.GetType() == cmStateEnums::OBJECT_LIBRARY) { return false; } if (!lg.GetMakefile()->IsOn("CMAKE_CUDA_COMPILER_HAS_DEVICE_LINK_PHASE")) { return false; } if (const char* resolveDeviceSymbols = target.GetProperty("CUDA_RESOLVE_DEVICE_SYMBOLS")) { // If CUDA_RESOLVE_DEVICE_SYMBOLS has been explicitly set we need // to honor the value no matter what it is. return cmIsOn(resolveDeviceSymbols); } // Determine if we have any dependencies that require // us to do a device link step cmGeneratorTarget::LinkClosure const* closure = target.GetLinkClosure(config); if (cmContains(closure->Languages, "CUDA")) { if (const char* separableCompilation = target.GetProperty("CUDA_SEPARABLE_COMPILATION")) { if (cmIsOn(separableCompilation)) { bool doDeviceLinking = false; switch (target.GetType()) { case cmStateEnums::SHARED_LIBRARY: case cmStateEnums::MODULE_LIBRARY: case cmStateEnums::EXECUTABLE: doDeviceLinking = true; break; default: break; } return doDeviceLinking; } } cmComputeLinkInformation* pcli = target.GetLinkInformation(config); if (pcli) { cmLinkLineDeviceComputer deviceLinkComputer( &lg, lg.GetStateSnapshot().GetDirectory()); return deviceLinkComputer.ComputeRequiresDeviceLinking(*pcli); } return true; } return false; }