summaryrefslogtreecommitdiffstats
path: root/Tests/Complex/Executable/complex.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'Tests/Complex/Executable/complex.cxx')
-rw-r--r--Tests/Complex/Executable/complex.cxx96
1 files changed, 95 insertions, 1 deletions
diff --git a/Tests/Complex/Executable/complex.cxx b/Tests/Complex/Executable/complex.cxx
index 906616e..78f5b73 100644
--- a/Tests/Complex/Executable/complex.cxx
+++ b/Tests/Complex/Executable/complex.cxx
@@ -11,6 +11,8 @@ extern "C" {
#include "cmStandardIncludes.h"
#include "cmSystemTools.h"
#include "cmDynamicLoader.h"
+#include "cmSystemTools.h"
+#include "cmOrderLinkDirectories.h"
int cm_passed = 0;
int cm_failed = 0;
@@ -21,6 +23,77 @@ This is a problem. Looks like ADD_DEFINITIONS and REMOVE_DEFINITIONS does not wo
// 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");
+
+ if(!shouldFail)
+ {
+ std::string rm = Bdir;
+ rm += "/libA.a";
+ cmSystemTools::RemoveFile(rm.c_str());
+ }
+ cmTarget target;
+ target.AddLinkDirectory(Adir.c_str());
+ target.AddLinkDirectory(Bdir.c_str());
+ target.AddLinkDirectory(Cdir.c_str());
+ target.AddLinkDirectory("/lib/extra/stuff");
+
+ Adir += "/libA.a";
+ Bdir += "/libB.a";
+ Cdir += "/libC.a";
+
+ target.AddLinkLibrary(Adir.c_str(), cmTarget::GENERAL);
+ target.AddLinkLibrary(Bdir.c_str(), cmTarget::GENERAL);
+ target.AddLinkLibrary(Cdir.c_str(), cmTarget::GENERAL);
+ target.AddLinkLibrary("-lm", cmTarget::GENERAL);
+ std::vector<cmStdString> sortedpaths;
+ std::vector<cmStdString> linkItems;
+ cmOrderLinkDirectories orderLibs;
+ orderLibs.AddLinkExtension(".so");
+ orderLibs.AddLinkExtension(".a");
+ orderLibs.SetLinkInformation(target, cmTarget::GENERAL, "A");
+ bool ret = orderLibs.DetermineLibraryPathOrder();
+ orderLibs.GetLinkerInformation(sortedpaths, linkItems);
+ std::cerr << "Sorted Link Paths:\n";
+ for(std::vector<cmStdString>::iterator i = sortedpaths.begin();
+ i != sortedpaths.end(); ++i)
+ {
+ std::cerr << *i << "\n";
+ }
+ std::cerr << "Link Items: \n";
+ for(std::vector<cmStdString>::iterator i = linkItems.begin();
+ i != linkItems.end(); ++i)
+ {
+ std::cerr << *i << "\n";
+ }
+ if(!(linkItems[0] == "A" &&
+ linkItems[1] == "B" &&
+ linkItems[2] == "C" &&
+ linkItems[3] == "-lm" ))
+ {
+ std::cerr << "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)
+ {
+ if(!(sortedpaths[0][sortedpaths[0].size()-1] == 'f' &&
+ sortedpaths[1][sortedpaths[1].size()-1] == 'B' &&
+ sortedpaths[2][sortedpaths[2].size()-1] == 'C' &&
+ sortedpaths[3][sortedpaths[3].size()-1] == 'A' ))
+ {
+ std::cerr << "fail because order should be /lib/extra/stuff B C A and it is not\n";
+ return false;
+ }
+ }
+
+ return ret;
+}
void ForceStringUse()
{
@@ -927,6 +1000,28 @@ int main()
cmPassed("CMake SET CACHE FORCE");
#endif
+ // 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 worked.");
+ }
+ 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.");
+ }
+
// ----------------------------------------------------------------------
// Summary
@@ -936,6 +1031,5 @@ int main()
std::cout << "Failed: " << cm_failed << "\n";
return cm_failed;
}
-
return 0;
}