1
1
set (CMAKE_SKIP_RPATH FALSE )
2
+ if (NOT BUILD_LAGOM)
3
+ set (CMAKE_INSTALL_RPATH "$ORIGIN:$ORIGIN/../lib" )
4
+ set (CMAKE_BUILD_WITH_INSTALL_RPATH TRUE )
5
+ else ()
6
+ set (CMAKE_BUILD_RPATH "$ORIGIN:$ORIGIN/../lib" )
7
+ set (CMAKE_INSTALL_RPATH "$ORIGIN:$ORIGIN/../lib" )
8
+ endif ()
2
9
3
10
macro (add_test_lib NAME FILE)
4
11
add_library (${NAME} SHARED ${FILE} )
5
- serenity_set_implicit_links(${NAME} )
12
+ if (NOT BUILD_LAGOM)
13
+ serenity_set_implicit_links(${NAME} )
14
+ else ()
15
+ target_link_libraries (${NAME} PRIVATE AK LibCore)
16
+ endif ()
6
17
install (TARGETS ${NAME} DESTINATION usr/Tests/LibELF)
7
18
endmacro ()
8
19
9
20
macro (add_test_exe NAME FILE)
10
21
add_executable (${NAME} ${FILE} )
11
- serenity_set_implicit_links(${NAME} )
22
+ if (NOT BUILD_LAGOM)
23
+ serenity_set_implicit_links(${NAME} )
24
+ else ()
25
+ target_link_libraries (${NAME} PRIVATE AK LibCore)
26
+ endif ()
12
27
install (TARGETS ${NAME} DESTINATION usr/Tests/LibELF)
13
28
endmacro ()
14
29
@@ -19,53 +34,71 @@ macro(add_dlopen_lib NAME FUNCTION)
19
34
target_link_libraries (${NAME} PRIVATE LibLine)
20
35
endmacro ()
21
36
22
- add_dlopen_lib(DynlibA dynliba_function)
23
- add_dlopen_lib(DynlibB dynlibb_function)
24
-
25
- add_dlopen_lib(DynlibC dynlibc_function)
26
- set (CMAKE_INSTALL_RPATH $ORIGIN)
27
- add_dlopen_lib(DynlibD dynlibd_function)
28
- target_link_libraries (DynlibD PRIVATE DynlibC)
29
- unset (CMAKE_INSTALL_RPATH )
37
+ macro (target_link_manual TARGET LIB)
38
+ target_link_libraries (${TARGET} PRIVATE -Wl,--push-state,--no -as-needed $<TARGET_FILE:${LIB} > -Wl,--pop-state)
39
+ add_dependencies (${TARGET} ${LIB} )
40
+ endmacro ()
30
41
31
42
set (TEST_SOURCES
32
- test -elf.cpp
33
43
TestDlOpen.cpp
34
44
TestOrder.cpp
35
45
TestTLS.cpp
36
46
TestWeakSymbolResolution.cpp
37
47
)
38
48
39
49
foreach (source IN LISTS TEST_SOURCES)
40
- serenity_test("${source} " LibELF)
50
+ if (NOT BUILD_LAGOM)
51
+ serenity_test("${source} " LibELF)
52
+ else ()
53
+ get_filename_component (test_name ${source} NAME_WE )
54
+ lagom_test("${source} " WORKING_DIRECTORY "$<TARGET_FILE_DIR:${test_name} >" )
55
+ # FIXME: Figure out why on Ubuntu 22.04 dlopen ignores RUNPATH in executable.
56
+ set_tests_properties (${test_name} PROPERTIES ENVIRONMENT LD_LIBRARY_PATH=${CMAKE_LIBRARY_OUTPUT_DIRECTORY} )
57
+ endif ()
41
58
endforeach ()
42
59
60
+ # test-elf.cpp
61
+ if (NOT BUILD_LAGOM)
62
+ serenity_test(test -elf.cpp LibELF)
63
+ endif ()
64
+
65
+ # TestDlOpen.cpp
66
+ add_dlopen_lib(DynlibA dynliba_function)
67
+ add_dlopen_lib(DynlibB dynlibb_function)
68
+
69
+ add_dlopen_lib(DynlibC dynlibc_function)
70
+ add_dlopen_lib(DynlibD dynlibd_function)
71
+ target_link_manual(DynlibD DynlibC)
72
+
73
+ # TestTLS.cpp
43
74
add_test_lib(TLSDef TLSDef.cpp)
44
75
add_test_lib(TLSUse TLSUse.cpp)
45
76
target_compile_options (TLSUse PRIVATE -ftls-model=global -dynamic)
46
77
target_link_libraries (TLSUse PRIVATE LibCore LibTest LibThreading TLSDef)
47
- set_target_properties (TLSUse PROPERTIES INSTALL_RPATH "$ORIGIN" )
48
78
target_link_libraries (TestTLS PRIVATE TLSUse)
49
- set_target_properties (TestTLS PROPERTIES INSTALL_RPATH "$ORIGIN" )
50
79
80
+ # TestWeakSymbolResolution.cpp
51
81
add_test_lib(TestWeakSymbolResolution1 TestWeakSymbolResolution1.cpp)
52
82
add_test_lib(TestWeakSymbolResolution2 TestWeakSymbolResolution2.cpp)
53
- target_link_libraries (TestWeakSymbolResolution PRIVATE TestWeakSymbolResolution1 TestWeakSymbolResolution2 )
54
- set_target_properties (TestWeakSymbolResolution PROPERTIES INSTALL_RPATH "$ORIGIN" )
83
+ target_link_manual (TestWeakSymbolResolution TestWeakSymbolResolution1)
84
+ target_link_manual (TestWeakSymbolResolution TestWeakSymbolResolution2 )
55
85
86
+ # TestOrder.cpp
56
87
add_test_lib(TestOrderLib1 TestOrderLib1.cpp)
57
88
add_test_lib(TestOrderLib2 TestOrderLib2.cpp)
58
- target_link_libraries (TestOrderLib2 PRIVATE TestOrderLib1)
59
- set_target_properties (TestOrderLib2 PROPERTIES INSTALL_RPATH "$ORIGIN" )
89
+ target_link_manual(TestOrderLib2 TestOrderLib1)
60
90
61
- # NOTE: This is so ugly because CMake sorts targets supplied to target_link_libraries.
62
- # .elf extension here avoids direct invocations by SerenityOS's test runner.
63
91
add_test_exe(TestOrderExe1.elf TestOrderExe.cpp)
64
- target_link_libraries (TestOrderExe1.elf PRIVATE $<TARGET_FILE:TestOrderLib1> $<TARGET_FILE:TestOrderLib2>)
65
- add_dependencies (TestOrderExe1.elf TestOrderLib1 TestOrderLib2)
66
- set_target_properties (TestOrderExe1.elf PROPERTIES INSTALL_RPATH "$ORIGIN" )
92
+ target_link_manual(TestOrderExe1.elf TestOrderLib1)
93
+ target_link_manual(TestOrderExe1.elf TestOrderLib2)
67
94
68
95
add_test_exe(TestOrderExe2.elf TestOrderExe.cpp)
69
- target_link_libraries (TestOrderExe2.elf PRIVATE $<TARGET_FILE:TestOrderLib2> $<TARGET_FILE:TestOrderLib1>)
70
- add_dependencies (TestOrderExe2.elf TestOrderLib1 TestOrderLib2)
71
- set_target_properties (TestOrderExe2.elf PROPERTIES INSTALL_RPATH "$ORIGIN" )
96
+ target_link_manual(TestOrderExe2.elf TestOrderLib2)
97
+ target_link_manual(TestOrderExe2.elf TestOrderLib1)
98
+
99
+ add_dependencies (TestOrder
100
+ TestOrderLib1
101
+ TestOrderLib2
102
+ TestOrderExe1.elf
103
+ TestOrderExe2.elf
104
+ )
0 commit comments