[cmake-commits] king committed complex.cxx 1.95 1.97
cmake-commits at cmake.org
cmake-commits at cmake.org
Tue Jan 22 09:13:06 EST 2008
Update of /cvsroot/CMake/CMake/Tests/ComplexOneConfig/Executable
In directory public:/mounts/ram/cvs-serv11636/Tests/ComplexOneConfig/Executable
Modified Files:
complex.cxx
Log Message:
ENH: Implement linking with paths to library files instead of -L and -l separation. See bug #3832
- This is purely an implementation improvement. No interface has changed.
- Create cmComputeLinkInformation class
- Move and re-implement logic from:
cmLocalGenerator::ComputeLinkInformation
cmOrderLinkDirectories
- Link libraries to targets with their full path (if it is known)
- Dirs specified with link_directories command still added with -L
- Make link type specific to library names without paths
(name libfoo.a without path becomes -Wl,-Bstatic -lfoo)
- Make directory ordering specific to a runtime path computation feature
(look for conflicting SONAMEs instead of library names)
- Implement proper rpath support on HP-UX and AIX.
Index: complex.cxx
===================================================================
RCS file: /cvsroot/CMake/CMake/Tests/ComplexOneConfig/Executable/complex.cxx,v
retrieving revision 1.95
retrieving revision 1.97
diff -u -d -r1.95 -r1.97
--- complex.cxx 18 Jan 2008 01:34:10 -0000 1.95
+++ complex.cxx 22 Jan 2008 14:13:03 -0000 1.97
@@ -13,7 +13,6 @@
#include "cmSystemTools.h"
#include "cmDynamicLoader.h"
#include "cmSystemTools.h"
-#include "cmOrderLinkDirectories.h"
#include "cmGeneratedFileStream.h"
#include <cmsys/DynamicLoader.hxx>
#else
@@ -69,99 +68,6 @@
#endif
#ifdef COMPLEX_TEST_CMAKELIB
-// Here is a stupid function that tries to use std::string methods
-// so that the dec cxx compiler will instantiate the stuff that
-// we are using from the CMakeLib library....
-bool TestLibraryOrder(bool shouldFail)
-{
- std::string Adir = std::string(BINARY_DIR) + std::string("/A");
- std::string Bdir = std::string(BINARY_DIR) + std::string("/B");
- std::string Cdir = std::string(BINARY_DIR) + std::string("/C");
-#ifdef _WIN32
- // Avoid case problems for windows paths.
- if(Adir[0] >= 'A' && Adir[0] <= 'Z') { Adir[0] += 'a' - 'A'; }
- if(Bdir[0] >= 'A' && Bdir[0] <= 'Z') { Bdir[0] += 'a' - 'A'; }
- if(Cdir[0] >= 'A' && Cdir[0] <= 'Z') { Cdir[0] += 'a' - 'A'; }
- Adir = cmSystemTools::GetActualCaseForPath(Adir.c_str());
- Bdir = cmSystemTools::GetActualCaseForPath(Bdir.c_str());
- Cdir = cmSystemTools::GetActualCaseForPath(Cdir.c_str());
-#endif
-
- if(!shouldFail)
- {
- std::string rm = Bdir;
- rm += "/libA.a";
- cmSystemTools::RemoveFile(rm.c_str());
- }
- std::vector<std::string> linkLibraries;
- std::vector<std::string> linkDirectories;
- linkDirectories.push_back(Adir);
- linkDirectories.push_back(Bdir);
- linkDirectories.push_back(Cdir);
- linkDirectories.push_back("/lib/extra/stuff");
- Adir += "/libA.a";
- Bdir += "/libB.a";
- Cdir += "/libC.a";
- linkLibraries.push_back(Adir);
- linkLibraries.push_back(Bdir);
- linkLibraries.push_back(Cdir);
- linkLibraries.push_back("-lm");
- std::vector<cmStdString> sortedpaths;
- std::vector<cmStdString> linkItems;
- cmOrderLinkDirectories orderLibs;
- orderLibs.DebugOn();
- orderLibs.AddLinkExtension(".so");
- orderLibs.AddLinkExtension(".a");
- orderLibs.AddLinkPrefix("lib");
- cmTargetManifest manifest;
- orderLibs.SetLinkInformation("test", linkLibraries, linkDirectories,
- manifest, "");
- bool ret = orderLibs.DetermineLibraryPathOrder();
- if(!ret)
- {
- std::cout << orderLibs.GetWarnings() << "\n";
- }
- orderLibs.GetLinkerInformation(sortedpaths, linkItems);
- std::cout << "Sorted Link Paths:\n";
- for(std::vector<cmStdString>::iterator i = sortedpaths.begin();
- i != sortedpaths.end(); ++i)
- {
- std::cout << *i << "\n";
- }
- std::cout << "Link Items: \n";
- for(std::vector<cmStdString>::iterator i = linkItems.begin();
- i != linkItems.end(); ++i)
- {
- std::cout << *i << "\n";
- }
- if(!(linkItems[0] == "A" &&
- linkItems[1] == "B" &&
- linkItems[2] == "C" &&
- linkItems[3] == "-lm" ))
- {
- std::cout << "fail because link items should be A B C -lm and the are not\n";
- return shouldFail;
- }
-
-
- // if this is not the fail test then the order should be f B C A
- if(!shouldFail)
- {
- char order[5];
- order[4] = 0;
- for(int i =0; i < 4; ++i)
- {
- order[i] = sortedpaths[i][sortedpaths[i].size()-1];
- }
- if(!(strcmp(order, "fBCA") == 0 || strcmp(order, "BCAf") == 0))
- {
- std::cout << "fail because order should be /lib/extra/stuff B C A and it is not\n";
- return false;
- }
- }
- return ret;
-}
-
// ======================================================================
void TestAndRemoveFile(const char* filename)
@@ -286,6 +192,9 @@
}
#endif
+// Here is a stupid function that tries to use std::string methods
+// so that the dec cxx compiler will instantiate the stuff that
+// we are using from the CMakeLib library....
void ForceStringUse()
{
std::vector<std::string> v;
@@ -1283,27 +1192,6 @@
#endif
#ifdef COMPLEX_TEST_CMAKELIB
- // first run with shouldFail = true, this will
- // run with A B C as set by the CMakeList.txt file.
- if(!TestLibraryOrder(true))
- {
- cmPassed("CMake cmOrderLinkDirectories failed when it should.");
- }
- else
- {
- cmFailed("CMake cmOrderLinkDirectories failed to fail when given an impossible set of paths.");
- }
- // next run with shouldPass = true, this will
- // run with B/libA.a removed and should create the order
- // B C A
- if(TestLibraryOrder(false))
- {
- cmPassed("CMake cmOrderLinkDirectories worked.");
- }
- else
- {
- cmFailed("CMake cmOrderLinkDirectories failed.");
- }
// Test the generated file stream.
TestCMGeneratedFileSTream();
#endif
More information about the Cmake-commits
mailing list