diff options
Diffstat (limited to 'Tests/Dependency')
68 files changed, 552 insertions, 0 deletions
diff --git a/Tests/Dependency/1/CMakeLists.txt b/Tests/Dependency/1/CMakeLists.txt new file mode 100644 index 0000000..a8e74e4 --- /dev/null +++ b/Tests/Dependency/1/CMakeLists.txt @@ -0,0 +1,3 @@ +add_library( One OneSrc.c ) +# This library has no dependencies +target_link_libraries( One "" ) diff --git a/Tests/Dependency/1/OneSrc.c b/Tests/Dependency/1/OneSrc.c new file mode 100644 index 0000000..9801c25 --- /dev/null +++ b/Tests/Dependency/1/OneSrc.c @@ -0,0 +1,3 @@ +void OneFunction() +{ +} diff --git a/Tests/Dependency/CMakeLists.txt b/Tests/Dependency/CMakeLists.txt new file mode 100644 index 0000000..ebc2d10 --- /dev/null +++ b/Tests/Dependency/CMakeLists.txt @@ -0,0 +1,54 @@ +cmake_minimum_required (VERSION 2.6) +project( Dependency ) + +# to test directories with only one character One was changed to 1 +# There is one executable that depends on eight libraries. The +# system has the following dependency graph: +# +# NoDepA: +# NoDepB: NoDepA +# NoDepC: NoDepA +# 1: +# Two: Three +# Three: 1 Four +# Four: 1 Two NoDepA +# Five: Two +# SixA: Two Five +# SixB: Four Five +# Seven: Two +# Eight: Seven +# +# Exec: NoDepB NoDepC SixA SixB +# Exec2: Eight Five +# Exec3: Eight Five +# Exec4: Five Two +# +# The libraries One,...,Eight have their dependencies explicitly +# encoded. The libraries NoDepA,...,NoDepC do not. +# +# Although SixB does not depend on Two, there is a dependency listed +# in the corresponding CMakeLists.txt just because of commands used. + +add_subdirectory(NoDepA) +add_subdirectory(NoDepB) +add_subdirectory(NoDepC) +add_subdirectory(1) +add_subdirectory(Two) +add_subdirectory(Three) +add_subdirectory(Four) +add_subdirectory(Five) +add_subdirectory(Six) +add_subdirectory(Seven) +add_subdirectory(Eight) +add_subdirectory(Exec) +add_subdirectory(Exec2) +add_subdirectory(Exec3) +add_subdirectory(Exec4) + +# Specific cases added to test fixes to problems found in real +# projects. +add_subdirectory(Case1) +add_subdirectory(Case2) +add_subdirectory(Case3) +add_subdirectory(Case4) +add_subdirectory(Case5) diff --git a/Tests/Dependency/Case1/CMakeLists.txt b/Tests/Dependency/Case1/CMakeLists.txt new file mode 100644 index 0000000..4c5fc20 --- /dev/null +++ b/Tests/Dependency/Case1/CMakeLists.txt @@ -0,0 +1,19 @@ +project(CASE1) + +# The old anaylize lib depends stuff in cmTarget gets this case wrong. +# The cmComputeLinkDepends implementation gets it right. + +add_library(case1a STATIC a.c) + +add_library(case1b STATIC b.c b2.c) +target_link_libraries(case1b case1a) + +add_library(case1c STATIC c.c c2.c) +target_link_libraries(case1c case1b) + +add_library(case1d STATIC d.c) +target_link_libraries(case1d case1c) + +add_executable(hello main.c) +target_link_libraries(hello case1c case1b case1d case1c) + diff --git a/Tests/Dependency/Case1/a.c b/Tests/Dependency/Case1/a.c new file mode 100644 index 0000000..262f523 --- /dev/null +++ b/Tests/Dependency/Case1/a.c @@ -0,0 +1,4 @@ +int a() +{ + return 5; +} diff --git a/Tests/Dependency/Case1/b.c b/Tests/Dependency/Case1/b.c new file mode 100644 index 0000000..deda685 --- /dev/null +++ b/Tests/Dependency/Case1/b.c @@ -0,0 +1,6 @@ +extern int a(); + +int b() +{ + return a() + 17; +} diff --git a/Tests/Dependency/Case1/b2.c b/Tests/Dependency/Case1/b2.c new file mode 100644 index 0000000..f341da7 --- /dev/null +++ b/Tests/Dependency/Case1/b2.c @@ -0,0 +1,4 @@ +int b2() +{ + return 3; +} diff --git a/Tests/Dependency/Case1/c.c b/Tests/Dependency/Case1/c.c new file mode 100644 index 0000000..a3ec162 --- /dev/null +++ b/Tests/Dependency/Case1/c.c @@ -0,0 +1,6 @@ +extern int b(); + +int c() +{ + return b() + 42; +} diff --git a/Tests/Dependency/Case1/c2.c b/Tests/Dependency/Case1/c2.c new file mode 100644 index 0000000..317bb0f --- /dev/null +++ b/Tests/Dependency/Case1/c2.c @@ -0,0 +1,6 @@ +extern int b2(); + +int c2() +{ + return b2() + 1; +} diff --git a/Tests/Dependency/Case1/d.c b/Tests/Dependency/Case1/d.c new file mode 100644 index 0000000..f67aef7 --- /dev/null +++ b/Tests/Dependency/Case1/d.c @@ -0,0 +1,6 @@ +extern int c2(); + +int d() +{ + return c2() + 2; +} diff --git a/Tests/Dependency/Case1/main.c b/Tests/Dependency/Case1/main.c new file mode 100644 index 0000000..07191cc --- /dev/null +++ b/Tests/Dependency/Case1/main.c @@ -0,0 +1,10 @@ +extern int b(); +extern int c(); +extern int d(); + +int main() +{ + c(); + b(); + d(); +} diff --git a/Tests/Dependency/Case2/CMakeLists.txt b/Tests/Dependency/Case2/CMakeLists.txt new file mode 100644 index 0000000..21caaad --- /dev/null +++ b/Tests/Dependency/Case2/CMakeLists.txt @@ -0,0 +1,22 @@ +project(CASE2 C) + +add_library(case2Foo1 STATIC foo1.c foo1b.c foo1c.c) +add_library(case2Foo2 STATIC foo2.c foo2b.c foo2c.c) +add_library(case2Foo3 STATIC foo3.c foo3b.c foo3c.c) +target_link_libraries(case2Foo1 case2Foo2) +target_link_libraries(case2Foo2 case2Foo3) +target_link_libraries(case2Foo3 case2Foo1) +set_property(TARGET case2Foo1 PROPERTY LINK_INTERFACE_MULTIPLICITY 3) + +add_library(case2Bar1 STATIC bar1.c) +add_library(case2Bar2 STATIC bar2.c) +add_library(case2Bar3 STATIC bar3.c) +target_link_libraries(case2Bar1 case2Bar2 case2Foo1) +target_link_libraries(case2Bar2 case2Bar3) +target_link_libraries(case2Bar3 case2Bar1) + +add_executable(case2Zot zot.c) +target_link_libraries(case2Zot case2Bar1) + +#set_property(GLOBAL PROPERTY GLOBAL_DEPENDS_DEBUG_MODE 1) +#set(CMAKE_LINK_DEPENDS_DEBUG_MODE 1) diff --git a/Tests/Dependency/Case2/bar1.c b/Tests/Dependency/Case2/bar1.c new file mode 100644 index 0000000..6da9077 --- /dev/null +++ b/Tests/Dependency/Case2/bar1.c @@ -0,0 +1,10 @@ +extern int foo1(); +extern int bar2(void); +int bar1(void) +{ + return bar2(); +} +int bar1_from_bar3(void) +{ + return foo1(); +} diff --git a/Tests/Dependency/Case2/bar2.c b/Tests/Dependency/Case2/bar2.c new file mode 100644 index 0000000..00ed483 --- /dev/null +++ b/Tests/Dependency/Case2/bar2.c @@ -0,0 +1,5 @@ +extern int bar3(void); +int bar2(void) +{ + return bar3(); +} diff --git a/Tests/Dependency/Case2/bar3.c b/Tests/Dependency/Case2/bar3.c new file mode 100644 index 0000000..a950899 --- /dev/null +++ b/Tests/Dependency/Case2/bar3.c @@ -0,0 +1,5 @@ +extern int bar1_from_bar3(void); +int bar3(void) +{ + return bar1_from_bar3(); +} diff --git a/Tests/Dependency/Case2/foo1.c b/Tests/Dependency/Case2/foo1.c new file mode 100644 index 0000000..d476f2c --- /dev/null +++ b/Tests/Dependency/Case2/foo1.c @@ -0,0 +1,5 @@ +extern int foo2(void); +int foo1(void) +{ + return foo2(); +} diff --git a/Tests/Dependency/Case2/foo1b.c b/Tests/Dependency/Case2/foo1b.c new file mode 100644 index 0000000..e437014 --- /dev/null +++ b/Tests/Dependency/Case2/foo1b.c @@ -0,0 +1,5 @@ +extern int foo2b(void); +int foo1b(void) +{ + return foo2b(); +} diff --git a/Tests/Dependency/Case2/foo1c.c b/Tests/Dependency/Case2/foo1c.c new file mode 100644 index 0000000..af03dec --- /dev/null +++ b/Tests/Dependency/Case2/foo1c.c @@ -0,0 +1,5 @@ +extern int foo2c(void); +int foo1c(void) +{ + return foo2c(); +} diff --git a/Tests/Dependency/Case2/foo2.c b/Tests/Dependency/Case2/foo2.c new file mode 100644 index 0000000..587c77a --- /dev/null +++ b/Tests/Dependency/Case2/foo2.c @@ -0,0 +1,5 @@ +extern int foo3(void); +int foo2(void) +{ + return foo3(); +} diff --git a/Tests/Dependency/Case2/foo2b.c b/Tests/Dependency/Case2/foo2b.c new file mode 100644 index 0000000..6959e63 --- /dev/null +++ b/Tests/Dependency/Case2/foo2b.c @@ -0,0 +1,5 @@ +extern int foo3b(void); +int foo2b(void) +{ + return foo3b(); +} diff --git a/Tests/Dependency/Case2/foo2c.c b/Tests/Dependency/Case2/foo2c.c new file mode 100644 index 0000000..aedb61c --- /dev/null +++ b/Tests/Dependency/Case2/foo2c.c @@ -0,0 +1,5 @@ +extern int foo3c(void); +int foo2c(void) +{ + return foo3c(); +} diff --git a/Tests/Dependency/Case2/foo3.c b/Tests/Dependency/Case2/foo3.c new file mode 100644 index 0000000..cab9535 --- /dev/null +++ b/Tests/Dependency/Case2/foo3.c @@ -0,0 +1,5 @@ +extern int foo1b(void); +int foo3(void) +{ + return foo1b(); +} diff --git a/Tests/Dependency/Case2/foo3b.c b/Tests/Dependency/Case2/foo3b.c new file mode 100644 index 0000000..69d2c8c --- /dev/null +++ b/Tests/Dependency/Case2/foo3b.c @@ -0,0 +1,5 @@ +extern int foo1c(void); +int foo3b(void) +{ + return foo1c(); +} diff --git a/Tests/Dependency/Case2/foo3c.c b/Tests/Dependency/Case2/foo3c.c new file mode 100644 index 0000000..e774495 --- /dev/null +++ b/Tests/Dependency/Case2/foo3c.c @@ -0,0 +1,4 @@ +int foo3c(void) +{ + return 0; +} diff --git a/Tests/Dependency/Case2/zot.c b/Tests/Dependency/Case2/zot.c new file mode 100644 index 0000000..f25b493 --- /dev/null +++ b/Tests/Dependency/Case2/zot.c @@ -0,0 +1,5 @@ +extern int bar1(void); +int main(void) +{ + return bar1(); +} diff --git a/Tests/Dependency/Case3/CMakeLists.txt b/Tests/Dependency/Case3/CMakeLists.txt new file mode 100644 index 0000000..f01dd05 --- /dev/null +++ b/Tests/Dependency/Case3/CMakeLists.txt @@ -0,0 +1,10 @@ +project(CASE3 C) + +add_library(case3Foo1 STATIC foo1.c foo1b.c) +add_library(case3Foo2 STATIC foo2.c) + +add_executable(case3Bar bar.c) +target_link_libraries(case3Bar case3Foo1 case3Foo2 case3Foo1) + +#set_property(GLOBAL PROPERTY GLOBAL_DEPENDS_DEBUG_MODE 1) +#set(CMAKE_LINK_DEPENDS_DEBUG_MODE 1) diff --git a/Tests/Dependency/Case3/bar.c b/Tests/Dependency/Case3/bar.c new file mode 100644 index 0000000..62959c1 --- /dev/null +++ b/Tests/Dependency/Case3/bar.c @@ -0,0 +1,5 @@ +extern int foo1(void); +int main(void) +{ + return foo1(); +} diff --git a/Tests/Dependency/Case3/foo1.c b/Tests/Dependency/Case3/foo1.c new file mode 100644 index 0000000..d476f2c --- /dev/null +++ b/Tests/Dependency/Case3/foo1.c @@ -0,0 +1,5 @@ +extern int foo2(void); +int foo1(void) +{ + return foo2(); +} diff --git a/Tests/Dependency/Case3/foo1b.c b/Tests/Dependency/Case3/foo1b.c new file mode 100644 index 0000000..84933af --- /dev/null +++ b/Tests/Dependency/Case3/foo1b.c @@ -0,0 +1,4 @@ +int foo1b(void) +{ + return 0; +} diff --git a/Tests/Dependency/Case3/foo2.c b/Tests/Dependency/Case3/foo2.c new file mode 100644 index 0000000..9bbb5d7 --- /dev/null +++ b/Tests/Dependency/Case3/foo2.c @@ -0,0 +1,5 @@ +extern int foo1b(void); +int foo2(void) +{ + return foo1b(); +} diff --git a/Tests/Dependency/Case4/CMakeLists.txt b/Tests/Dependency/Case4/CMakeLists.txt new file mode 100644 index 0000000..a71049d --- /dev/null +++ b/Tests/Dependency/Case4/CMakeLists.txt @@ -0,0 +1,19 @@ +project(CASE4 C) + +# This is not really a circular dependency. "case4Bar" refers to a +# third-party library that happens to match the executable name, which +# is okay when the executable is not a linkable target (ENABLE_EXPORTS +# is not set). This tests whether CMake avoids incorrectly reporting +# a circular dependency. In practice case4Foo may be a shared +# library, but we skip that here because we do not want it to actually +# have to find the third-party library. +add_library(case4Foo STATIC foo.c) +target_link_libraries(case4Foo case4Bar) + +# The executable avoids linking to a library with its own name, which +# has been a CMake-ism for a long time, so we will not get a link +# failure. An imported target or executable with an OUTPUT_NAME set +# may be used if the user really wants to link a third-party library +# into an executable of the same name. +add_executable(case4Bar bar.c) +target_link_libraries(case4Bar case4Foo) diff --git a/Tests/Dependency/Case4/bar.c b/Tests/Dependency/Case4/bar.c new file mode 100644 index 0000000..08092f9 --- /dev/null +++ b/Tests/Dependency/Case4/bar.c @@ -0,0 +1,5 @@ +extern int foo(); +int main() +{ + return foo(); +} diff --git a/Tests/Dependency/Case4/foo.c b/Tests/Dependency/Case4/foo.c new file mode 100644 index 0000000..e05eb7e --- /dev/null +++ b/Tests/Dependency/Case4/foo.c @@ -0,0 +1,4 @@ +int foo() +{ + return 0; +} diff --git a/Tests/Dependency/Case5/CMakeLists.txt b/Tests/Dependency/Case5/CMakeLists.txt new file mode 100644 index 0000000..e954b02 --- /dev/null +++ b/Tests/Dependency/Case5/CMakeLists.txt @@ -0,0 +1,8 @@ +project(CASE5 C) + +add_library(case5Foo SHARED foo.c) +add_library(case5Bar STATIC bar.c) +target_link_libraries(case5Bar case5Foo) + +add_executable(case5 main.c) +target_link_libraries(case5 case5Foo case5Bar) diff --git a/Tests/Dependency/Case5/bar.c b/Tests/Dependency/Case5/bar.c new file mode 100644 index 0000000..fcbd135 --- /dev/null +++ b/Tests/Dependency/Case5/bar.c @@ -0,0 +1,12 @@ +#ifdef _WIN32 +__declspec(dllimport) +#endif + void foo(void); + +#include <stdio.h> + +void bar(void) +{ + foo(); + printf("bar()\n"); +} diff --git a/Tests/Dependency/Case5/foo.c b/Tests/Dependency/Case5/foo.c new file mode 100644 index 0000000..b82b7c2 --- /dev/null +++ b/Tests/Dependency/Case5/foo.c @@ -0,0 +1,9 @@ +#include <stdio.h> + +#ifdef _WIN32 +__declspec(dllexport) +#endif + void foo(void) +{ + printf("foo()\n"); +} diff --git a/Tests/Dependency/Case5/main.c b/Tests/Dependency/Case5/main.c new file mode 100644 index 0000000..a967944 --- /dev/null +++ b/Tests/Dependency/Case5/main.c @@ -0,0 +1,7 @@ +void bar(void); + +int main(int argc, char* argv[]) +{ + bar(); + return 0; +} diff --git a/Tests/Dependency/Eight/CMakeLists.txt b/Tests/Dependency/Eight/CMakeLists.txt new file mode 100644 index 0000000..db5e2df --- /dev/null +++ b/Tests/Dependency/Eight/CMakeLists.txt @@ -0,0 +1,3 @@ +add_library( Eight EightSrc.c ) +target_link_libraries( Eight Seven ) + diff --git a/Tests/Dependency/Eight/EightSrc.c b/Tests/Dependency/Eight/EightSrc.c new file mode 100644 index 0000000..7bfa481 --- /dev/null +++ b/Tests/Dependency/Eight/EightSrc.c @@ -0,0 +1,6 @@ +void SevenFunction(); + +void EightFunction() +{ + SevenFunction(); +} diff --git a/Tests/Dependency/Exec/CMakeLists.txt b/Tests/Dependency/Exec/CMakeLists.txt new file mode 100644 index 0000000..a920685 --- /dev/null +++ b/Tests/Dependency/Exec/CMakeLists.txt @@ -0,0 +1,7 @@ +# This executable directly depends on NoDepB, NoDepC, SixA and SixB. However, +# since NoDepB and NoDepC do not have explicit dependency information, +# and they depend on NoDepA, we have to manually specify that dependency. +link_libraries( NoDepB NoDepC NoDepA SixB SixA ) + +add_executable( exec ExecMain.c ) + diff --git a/Tests/Dependency/Exec/ExecMain.c b/Tests/Dependency/Exec/ExecMain.c new file mode 100644 index 0000000..9572afd --- /dev/null +++ b/Tests/Dependency/Exec/ExecMain.c @@ -0,0 +1,18 @@ +#include <stdio.h> + +void NoDepBFunction(); +void NoDepCFunction(); +void SixAFunction(); +void SixBFunction(); + +int main() +{ + SixAFunction(); + SixBFunction(); + NoDepBFunction(); + NoDepCFunction(); + + printf("Dependency test executable ran successfully.\n"); + + return 0; +} diff --git a/Tests/Dependency/Exec2/CMakeLists.txt b/Tests/Dependency/Exec2/CMakeLists.txt new file mode 100644 index 0000000..04d6fe8 --- /dev/null +++ b/Tests/Dependency/Exec2/CMakeLists.txt @@ -0,0 +1,12 @@ +# Here, Eight depends on Seven, which has the same dependencies as Five. +# If the dependencies of Five are emitted, and then we attempt to emit the +# dependencies of Seven, then we find that they have already been done. So: +# Original line: Eight Five +# Add deps of Five: Eight Five Two ... NoDepA +# Now, we must make sure that Seven gets inserted between Five and Two, and +# not at the end. Unfortunately, if we get it wrong, the test will only +# fail on a platform where the link order makes a difference. +link_libraries( Eight Five ) + +add_executable( exec2 ExecMain.c ) + diff --git a/Tests/Dependency/Exec2/ExecMain.c b/Tests/Dependency/Exec2/ExecMain.c new file mode 100644 index 0000000..385cce1 --- /dev/null +++ b/Tests/Dependency/Exec2/ExecMain.c @@ -0,0 +1,14 @@ +#include <stdio.h> + +void FiveFunction(); +void EightFunction(); + +int main() +{ + FiveFunction(); + EightFunction(); + + printf("Dependency test executable ran successfully.\n"); + + return 0; +} diff --git a/Tests/Dependency/Exec3/CMakeLists.txt b/Tests/Dependency/Exec3/CMakeLists.txt new file mode 100644 index 0000000..605fbc9 --- /dev/null +++ b/Tests/Dependency/Exec3/CMakeLists.txt @@ -0,0 +1,6 @@ +# Here, Five already has it's immediate dependency, Two satisfied. We must +# make sure Two gets output anyway, because Eight indirectly depends on it. +link_libraries( Five Two Eight Five ) + +add_executable( exec3 ExecMain.c ) + diff --git a/Tests/Dependency/Exec3/ExecMain.c b/Tests/Dependency/Exec3/ExecMain.c new file mode 100644 index 0000000..385cce1 --- /dev/null +++ b/Tests/Dependency/Exec3/ExecMain.c @@ -0,0 +1,14 @@ +#include <stdio.h> + +void FiveFunction(); +void EightFunction(); + +int main() +{ + FiveFunction(); + EightFunction(); + + printf("Dependency test executable ran successfully.\n"); + + return 0; +} diff --git a/Tests/Dependency/Exec4/CMakeLists.txt b/Tests/Dependency/Exec4/CMakeLists.txt new file mode 100644 index 0000000..94c6bf5 --- /dev/null +++ b/Tests/Dependency/Exec4/CMakeLists.txt @@ -0,0 +1,6 @@ +# Even though Five's dependency on Two is explicitly satisfied, Two +# must be emitted again in order to satisfy a cyclic dependency on Three. +link_libraries( Five Two Five ) + +add_executable( exec4 ExecMain.c ) + diff --git a/Tests/Dependency/Exec4/ExecMain.c b/Tests/Dependency/Exec4/ExecMain.c new file mode 100644 index 0000000..0cfcce9 --- /dev/null +++ b/Tests/Dependency/Exec4/ExecMain.c @@ -0,0 +1,14 @@ +#include <stdio.h> + +void FiveFunction(); +void TwoFunction(); + +int main() +{ + FiveFunction(); + TwoFunction(); + + printf("Dependency test executable ran successfully.\n"); + + return 0; +} diff --git a/Tests/Dependency/Five/CMakeLists.txt b/Tests/Dependency/Five/CMakeLists.txt new file mode 100644 index 0000000..19c1c77 --- /dev/null +++ b/Tests/Dependency/Five/CMakeLists.txt @@ -0,0 +1,3 @@ +add_library( Five FiveSrc.c ) +target_link_libraries( Five Two ) + diff --git a/Tests/Dependency/Five/FiveSrc.c b/Tests/Dependency/Five/FiveSrc.c new file mode 100644 index 0000000..33d8ad7 --- /dev/null +++ b/Tests/Dependency/Five/FiveSrc.c @@ -0,0 +1,6 @@ +void TwoFunction(); + +void FiveFunction() +{ + TwoFunction(); +} diff --git a/Tests/Dependency/Four/CMakeLists.txt b/Tests/Dependency/Four/CMakeLists.txt new file mode 100644 index 0000000..71c531f --- /dev/null +++ b/Tests/Dependency/Four/CMakeLists.txt @@ -0,0 +1,6 @@ +include_directories(${Dependency_BINARY_DIR}/Two) +add_library( Four FourSrc.c ) +target_link_libraries( Four One Two NoDepA ) + +# TwoCustom must build before Four. +add_dependencies(Four TwoCustom) diff --git a/Tests/Dependency/Four/FourSrc.c b/Tests/Dependency/Four/FourSrc.c new file mode 100644 index 0000000..4ea996d --- /dev/null +++ b/Tests/Dependency/Four/FourSrc.c @@ -0,0 +1,15 @@ +#include <two-test.h> /* Requires TwoCustom to be built first. */ +void NoDepAFunction(); +void OneFunction(); +void TwoFunction(); + +void FourFunction() +{ + static int count = 0; + if (count == 0) { + ++count; + TwoFunction(); + } + OneFunction(); + NoDepAFunction(); +} diff --git a/Tests/Dependency/NoDepA/CMakeLists.txt b/Tests/Dependency/NoDepA/CMakeLists.txt new file mode 100644 index 0000000..543402d --- /dev/null +++ b/Tests/Dependency/NoDepA/CMakeLists.txt @@ -0,0 +1 @@ +add_library( NoDepA NoDepASrc.c ) diff --git a/Tests/Dependency/NoDepA/NoDepASrc.c b/Tests/Dependency/NoDepA/NoDepASrc.c new file mode 100644 index 0000000..8c4072b --- /dev/null +++ b/Tests/Dependency/NoDepA/NoDepASrc.c @@ -0,0 +1,3 @@ +void NoDepAFunction() +{ +} diff --git a/Tests/Dependency/NoDepB/CMakeLists.txt b/Tests/Dependency/NoDepB/CMakeLists.txt new file mode 100644 index 0000000..1c70f37 --- /dev/null +++ b/Tests/Dependency/NoDepB/CMakeLists.txt @@ -0,0 +1,3 @@ +add_library( NoDepB NoDepBSrc.c ) +# This library depends on NoDepA, but the +# dependency is not explicitly specified. diff --git a/Tests/Dependency/NoDepB/NoDepBSrc.c b/Tests/Dependency/NoDepB/NoDepBSrc.c new file mode 100644 index 0000000..ddc71c5 --- /dev/null +++ b/Tests/Dependency/NoDepB/NoDepBSrc.c @@ -0,0 +1,6 @@ +void NoDepAFunction(); + +void NoDepBFunction() +{ + NoDepAFunction(); +} diff --git a/Tests/Dependency/NoDepC/CMakeLists.txt b/Tests/Dependency/NoDepC/CMakeLists.txt new file mode 100644 index 0000000..dd41ceb --- /dev/null +++ b/Tests/Dependency/NoDepC/CMakeLists.txt @@ -0,0 +1,3 @@ +add_library( NoDepC NoDepCSrc.c ) +# This library depends on NoDepA, but the +# dependency is not explicitly specified. diff --git a/Tests/Dependency/NoDepC/NoDepCSrc.c b/Tests/Dependency/NoDepC/NoDepCSrc.c new file mode 100644 index 0000000..b478c59 --- /dev/null +++ b/Tests/Dependency/NoDepC/NoDepCSrc.c @@ -0,0 +1,6 @@ +void NoDepAFunction(); + +void NoDepCFunction() +{ + NoDepAFunction(); +} diff --git a/Tests/Dependency/Seven/CMakeLists.txt b/Tests/Dependency/Seven/CMakeLists.txt new file mode 100644 index 0000000..7fba55c --- /dev/null +++ b/Tests/Dependency/Seven/CMakeLists.txt @@ -0,0 +1,3 @@ +add_library( Seven SevenSrc.c ) +target_link_libraries( Seven Two ) + diff --git a/Tests/Dependency/Seven/SevenSrc.c b/Tests/Dependency/Seven/SevenSrc.c new file mode 100644 index 0000000..e1f3329 --- /dev/null +++ b/Tests/Dependency/Seven/SevenSrc.c @@ -0,0 +1,6 @@ +void TwoFunction(); + +void SevenFunction() +{ + TwoFunction(); +} diff --git a/Tests/Dependency/Six/CMakeLists.txt b/Tests/Dependency/Six/CMakeLists.txt new file mode 100644 index 0000000..db12051 --- /dev/null +++ b/Tests/Dependency/Six/CMakeLists.txt @@ -0,0 +1,12 @@ +# In some projects, people don't use TARGET_LINK_LIBRARIES, but just +# use an all-encompassing LINK_LIBRARIES. And sometimes they don't +# specify them in the correct order. + +link_libraries( Two ) +link_libraries( Five ) + +add_library( SixA SixASrc.c ) + +add_library( SixB SixBSrc.c ) +target_link_libraries( SixB Four ) + diff --git a/Tests/Dependency/Six/SixASrc.c b/Tests/Dependency/Six/SixASrc.c new file mode 100644 index 0000000..7ea3711 --- /dev/null +++ b/Tests/Dependency/Six/SixASrc.c @@ -0,0 +1,8 @@ +void FiveFunction(); +void TwoFunction(); + +void SixAFunction() +{ + FiveFunction(); + TwoFunction(); +} diff --git a/Tests/Dependency/Six/SixBSrc.c b/Tests/Dependency/Six/SixBSrc.c new file mode 100644 index 0000000..92f9607 --- /dev/null +++ b/Tests/Dependency/Six/SixBSrc.c @@ -0,0 +1,10 @@ +void TwoFunction(); +void FiveFunction(); +void FourFunction(); + +void SixBFunction() +{ + TwoFunction(); + FiveFunction(); + FourFunction(); +} diff --git a/Tests/Dependency/Three/CMakeLists.txt b/Tests/Dependency/Three/CMakeLists.txt new file mode 100644 index 0000000..3897f0c --- /dev/null +++ b/Tests/Dependency/Three/CMakeLists.txt @@ -0,0 +1,3 @@ +add_library( Three ThreeSrc.c ) +target_link_libraries( Three One Four ) + diff --git a/Tests/Dependency/Three/ThreeSrc.c b/Tests/Dependency/Three/ThreeSrc.c new file mode 100644 index 0000000..3e814f3 --- /dev/null +++ b/Tests/Dependency/Three/ThreeSrc.c @@ -0,0 +1,12 @@ +void OneFunction(); +void FourFunction(); + +void ThreeFunction() +{ + static int count = 0; + if (count == 0) { + ++count; + FourFunction(); + } + OneFunction(); +} diff --git a/Tests/Dependency/Two/CMakeLists.txt b/Tests/Dependency/Two/CMakeLists.txt new file mode 100644 index 0000000..19a0703 --- /dev/null +++ b/Tests/Dependency/Two/CMakeLists.txt @@ -0,0 +1,20 @@ +include_directories(${CMAKE_CURRENT_BINARY_DIR}) +add_library( Two TwoSrc.c ) +target_link_libraries( Two Three ) + +# Setup a target to cause failure if Two does not depend on it or if +# Two actually links to it. This will test that a utility dependency +# on a library target works properly. +add_custom_command( + OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/two-test.h + COMMAND ${CMAKE_COMMAND} -E copy_if_different + ${CMAKE_CURRENT_SOURCE_DIR}/two-test.h.in + ${CMAKE_CURRENT_BINARY_DIR}/two-test.h + DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/two-test.h.in + ) +add_library( TwoCustom TwoCustomSrc.c ${CMAKE_CURRENT_BINARY_DIR}/two-test.h) +set_target_properties(TwoCustom PROPERTIES EXCLUDE_FROM_ALL 1) +target_link_libraries(TwoCustom Three) + +# Add a utility dependency to make sure it works without linking. +add_dependencies(Two TwoCustom) diff --git a/Tests/Dependency/Two/TwoCustomSrc.c b/Tests/Dependency/Two/TwoCustomSrc.c new file mode 100644 index 0000000..ac31dcf --- /dev/null +++ b/Tests/Dependency/Two/TwoCustomSrc.c @@ -0,0 +1,10 @@ +extern void NoFunction(); + +/* Provide a function that is supposed to be found in the Three + library. If Two links to TwoCustom then TwoCustom will come before + Three and this symbol will be used. Since NoFunction is not + defined, that will cause a link failure. */ +void ThreeFunction() +{ + NoFunction(); +} diff --git a/Tests/Dependency/Two/TwoSrc.c b/Tests/Dependency/Two/TwoSrc.c new file mode 100644 index 0000000..dbdf524 --- /dev/null +++ b/Tests/Dependency/Two/TwoSrc.c @@ -0,0 +1,10 @@ +#include <two-test.h> + +void TwoFunction() +{ + static int count = 0; + if (count == 0) { + ++count; + ThreeFunction(); + } +} diff --git a/Tests/Dependency/Two/two-test.h.in b/Tests/Dependency/Two/two-test.h.in new file mode 100644 index 0000000..8c6a7f7 --- /dev/null +++ b/Tests/Dependency/Two/two-test.h.in @@ -0,0 +1 @@ +extern void ThreeFunction(); |