Skip to content

Commit 70118c3

Browse files
authored
Merge pull request #214 from compnerd/build
build: add CMake based build system for XCTest
2 parents 5b6754b + ec1cf24 commit 70118c3

File tree

3 files changed

+259
-0
lines changed

3 files changed

+259
-0
lines changed

CMakeLists.txt

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
2+
cmake_minimum_required(VERSION 3.4.3)
3+
4+
list(APPEND CMAKE_MODULE_PATH
5+
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules")
6+
7+
project(XCTest
8+
LANGUAGES
9+
C)
10+
11+
option(XCTEST_PATH_TO_LIBDISPATCH_SOURCE "Path to libdispatch source" "")
12+
option(XCTEST_PATH_TO_LIBDISPATCH_BUILD "Path to libdispatch build" "")
13+
14+
option(XCTEST_PATH_TO_FOUNDATION_BUILD "Path to Foundation build" "")
15+
16+
option(XCTEST_PATH_TO_COREFOUNDATION_BUILD "Path to CoreFoundation build" "")
17+
18+
find_package(LLVM CONFIG)
19+
if(NOT LLVM_FOUND)
20+
message(SEND_ERROR "Could not find LLVM; configure with -DCMAKE_PREFIX_PATH=/path/to/llvm/install")
21+
endif()
22+
message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
23+
message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")
24+
25+
include(${LLVM_DIR}/LLVMConfig.cmake)
26+
27+
list(APPEND CMAKE_MODULE_PATH ${LLVM_DIR})
28+
include(AddLLVM)
29+
30+
include(SwiftSupport)
31+
include(GNUInstallDirs)
32+
33+
set(swift_optimization_flags)
34+
if(CMAKE_BUILD_TYPE MATCHES Release)
35+
set(swift_optimization_flags -O)
36+
endif()
37+
38+
add_swift_library(XCTest
39+
MODULE_NAME
40+
XCTest
41+
MODULE_LINK_NAME
42+
XCTest
43+
MODULE_PATH
44+
${CMAKE_CURRENT_BINARY_DIR}/swift/XCTest.swiftmodule
45+
OUTPUT
46+
${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}XCTest${CMAKE_SHARED_LIBRARY_SUFFIX}
47+
LINK_FLAGS
48+
-L${XCTEST_PATH_TO_LIBDISPATCH_BUILD}/src -ldispatch
49+
-L${XCTEST_PATH_TO_FOUNDATION_BUILD} -lFoundation
50+
SOURCES
51+
Sources/XCTest/Private/WallClockTimeMetric.swift
52+
Sources/XCTest/Private/TestListing.swift
53+
Sources/XCTest/Private/XCTestCaseSuite.swift
54+
Sources/XCTest/Private/TestFiltering.swift
55+
Sources/XCTest/Private/XCTestInternalObservation.swift
56+
Sources/XCTest/Private/ObjectWrapper.swift
57+
Sources/XCTest/Private/PerformanceMeter.swift
58+
Sources/XCTest/Private/PrintObserver.swift
59+
Sources/XCTest/Private/ArgumentParser.swift
60+
Sources/XCTest/Private/XCPredicateExpectation.swift
61+
Sources/XCTest/Public/XCTestRun.swift
62+
Sources/XCTest/Public/XCTestMain.swift
63+
Sources/XCTest/Public/XCTestCase.swift
64+
Sources/XCTest/Public/XCTestSuite.swift
65+
Sources/XCTest/Public/XCTestSuiteRun.swift
66+
Sources/XCTest/Public/XCTestErrors.swift
67+
Sources/XCTest/Public/XCTestObservation.swift
68+
Sources/XCTest/Public/XCTestCaseRun.swift
69+
Sources/XCTest/Public/XCAbstractTest.swift
70+
Sources/XCTest/Public/XCTestObservationCenter.swift
71+
Sources/XCTest/Public/XCTestCase+Performance.swift
72+
Sources/XCTest/Public/XCTAssert.swift
73+
Sources/XCTest/Public/Asynchronous/XCTestCase+NotificationExpectation.swift
74+
Sources/XCTest/Public/Asynchronous/XCTestCase+PredicateExpectation.swift
75+
Sources/XCTest/Public/Asynchronous/XCPredicateExpectationHandler.swift
76+
Sources/XCTest/Public/Asynchronous/XCWaitCompletionHandler.swift
77+
Sources/XCTest/Public/Asynchronous/XCNotificationExpectationHandler.swift
78+
Sources/XCTest/Public/Asynchronous/XCTestCase+Asynchronous.swift
79+
Sources/XCTest/Public/Asynchronous/XCTestExpectation.swift
80+
SWIFT_FLAGS
81+
${swift_optimization_flags}
82+
83+
-I${XCTEST_PATH_TO_LIBDISPATCH_SOURCE}
84+
-I${XCTEST_PATH_TO_LIBDISPATCH_BUILD}/src/swift
85+
-Xcc -fblocks
86+
87+
-I${XCTEST_PATH_TO_FOUNDATION_BUILD}/swift
88+
-Fsystem ${XCTEST_PATH_TO_COREFOUNDATION_BUILD}/System/Library/Frameworks)
89+
90+
if(EXISTS ${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py)
91+
set(LIT_COMMAND "${PYTHON_EXECUTABLE};${LLVM_MAIN_SRC_DIR}/utils/lit/lit.py"
92+
CACHE STRING "command used to spawn llvm-lit")
93+
else()
94+
find_program(LIT_COMMAND NAMES llvm-lit lit.py lit)
95+
endif()
96+
add_custom_target(check-xctest
97+
COMMAND
98+
${CMAKE_COMMAND} -E env
99+
BUILT_PRODUCTS_DIR=${CMAKE_BINARY_DIR}
100+
CORE_FOUNDATION_BUILT_PRODUCTS_DIR=${XCTEST_PATH_TO_COREFOUNDATION_BUILD}
101+
FOUNDATION_BUILT_PRODUCTS_DIR=${XCTEST_PATH_TO_FOUNDATION_BUILD}
102+
LIBDISPATCH_SRC_DIR=${XCTEST_PATH_TO_LIBDISPATCH_SOURCE}
103+
LIBDISPATCH_BUILD_DIR=${XCTEST_PATH_TO_LIBDISPATCH_BUILD}
104+
LIBDISPATCH_OVERLAY_DIR=${XCTEST_PATH_TO_LIBDISPATCH_BUILD}/swift
105+
SWIFT_EXEC=${CMAKE_SWIFT_COMPILER}
106+
${LIT_COMMAND} -sv ${CMAKE_SOURCE_DIR}/Tests/Functional
107+
COMMENT
108+
"Running XCTest functional test suite"
109+
DEPENDS
110+
XCTest
111+
USES_TERMINAL)
112+
113+
install(FILES
114+
${CMAKE_CURRENT_BINARY_DIR}/swift/XCTest.swiftdoc
115+
${CMAKE_CURRENT_BINARY_DIR}/swift/XCTest.swiftmodule
116+
DESTINATION
117+
${CMAKE_INSTALL_FULL_LIBDIR}/swift/${CMAKE_SYSTEM_NAME}/${CMAKE_SYSTEM_PROCESSOR})
118+
install(FILES
119+
${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_SHARED_LIBRARY_PREFIX}XCTest${CMAKE_SHARED_LIBRARY_SUFFIX}
120+
DESTINATION
121+
${CMAKE_INSTALL_FULL_LIBDIR})
122+

Tests/Functional/lit.cfg

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ swift_exec = [
4545
'-Xlinker', built_products_dir,
4646
'-L', built_products_dir,
4747
'-I', built_products_dir,
48+
'-I', os.path.join(built_products_dir, 'swift'),
4849
]
4950

5051
if platform.system() == 'Darwin':
@@ -76,7 +77,9 @@ else:
7677
'-Xlinker', foundation_dir,
7778
'-L', foundation_dir,
7879
'-I', foundation_dir,
80+
'-I', os.path.join(foundation_dir, 'swift'),
7981
'-I', core_foundation_dir,
82+
'-F', os.path.join(core_foundation_dir, 'System', 'Library', 'Frameworks'),
8083
])
8184
config.environment['LD_LIBRARY_PATH'] = foundation_dir
8285
# We also need to link swift-corelibs-libdispatch, if
@@ -92,6 +95,7 @@ else:
9295
'-I', libdispatch_src_dir,
9396
'-I', libdispatch_overlay_dir,
9497
'-L', libdispatch_build_dir,
98+
'-L', os.path.join(libdispatch_build_dir, 'src'),
9599
])
96100

97101
# Having prepared the swiftc command, we set the substitution.

cmake/modules/SwiftSupport.cmake

Lines changed: 133 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,133 @@
1+
2+
include(CMakeParseArguments)
3+
4+
function(add_swift_target target)
5+
set(options LIBRARY)
6+
set(single_value_options MODULE_NAME;MODULE_LINK_NAME;MODULE_PATH;MODULE_CACHE_PATH;OUTPUT;TARGET)
7+
set(multiple_value_options CFLAGS;DEPENDS;LINK_FLAGS;SOURCES;SWIFT_FLAGS)
8+
9+
cmake_parse_arguments(AST "${options}" "${single_value_options}" "${multiple_value_options}" ${ARGN})
10+
11+
set(flags ${CMAKE_SWIFT_FLAGS})
12+
set(link_flags)
13+
14+
if(AST_TARGET)
15+
list(APPEND flags -target;${AST_TARGET})
16+
endif()
17+
if(AST_MODULE_NAME)
18+
list(APPEND flags -module-name;${AST_MODULE_NAME})
19+
else()
20+
list(APPEND flags -module-name;${target})
21+
endif()
22+
if(AST_MODULE_LINK_NAME)
23+
list(APPEND flags -module-link-name;${AST_MODULE_LINK_NAME})
24+
endif()
25+
if(AST_MODULE_CACHE_PATH)
26+
list(APPEND flags -module-cache-path;${AST_MODULE_CACHE_PATH})
27+
endif()
28+
if(AST_SWIFT_FLAGS)
29+
foreach(flag ${AST_SWIFT_FLAGS})
30+
list(APPEND flags ${flag})
31+
endforeach()
32+
endif()
33+
if(AST_CFLAGS)
34+
foreach(flag ${AST_CFLAGS})
35+
list(APPEND flags -Xcc;${flag})
36+
endforeach()
37+
endif()
38+
if(AST_LINK_FLAGS)
39+
foreach(flag ${AST_LINK_FLAGS})
40+
list(APPEND link_flags ${flag})
41+
endforeach()
42+
endif()
43+
if(NOT AST_OUTPUT)
44+
if(AST_LIBRARY)
45+
set(AST_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${target}.dir/${CMAKE_SHARED_LIBRARY_PREFIX}${target}${CMAKE_SHARED_LIBRARY_SUFFIX})
46+
else()
47+
set(AST_OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/${target}.dir/${target}${CMAKE_EXECUTABLE_SUFFIX})
48+
endif()
49+
endif()
50+
51+
set(sources)
52+
foreach(source ${AST_SOURCES})
53+
get_filename_component(location ${source} PATH)
54+
if(IS_ABSOLUTE ${location})
55+
list(APPEND sources ${source})
56+
else()
57+
list(APPEND sources ${CMAKE_CURRENT_SOURCE_DIR}/${source})
58+
endif()
59+
endforeach()
60+
61+
set(objs)
62+
set(mods)
63+
set(docs)
64+
set(i 0)
65+
foreach(source ${sources})
66+
get_filename_component(name ${source} NAME)
67+
68+
set(obj ${CMAKE_CURRENT_BINARY_DIR}/${target}.dir/${name}${CMAKE_C_OUTPUT_EXTENSION})
69+
set(mod ${CMAKE_CURRENT_BINARY_DIR}/${target}.dir/${name}.swiftmodule~partial)
70+
set(doc ${CMAKE_CURRENT_BINARY_DIR}/${target}.dir/${name}.swiftdoc~partial)
71+
72+
set(all_sources ${sources})
73+
list(INSERT all_sources ${i} -primary-file)
74+
75+
add_custom_command(OUTPUT
76+
${obj}
77+
${mod}
78+
${doc}
79+
DEPENDS
80+
${source}
81+
COMMAND
82+
${CMAKE_SWIFT_COMPILER} -frontend ${flags} -emit-module-path ${mod} -emit-module-doc-path ${doc} -o ${obj} -c ${all_sources})
83+
84+
list(APPEND objs ${obj})
85+
list(APPEND mods ${mod})
86+
list(APPEND docs ${doc})
87+
88+
math(EXPR i "${i}+1")
89+
endforeach()
90+
91+
if(AST_LIBRARY)
92+
get_filename_component(module_directory ${AST_MODULE_PATH} DIRECTORY)
93+
94+
set(module ${AST_MODULE_PATH})
95+
set(documentation ${module_directory}/${AST_MODULE_NAME}.swiftdoc)
96+
97+
add_custom_command(OUTPUT
98+
${module}
99+
${documentation}
100+
DEPENDS
101+
${mods}
102+
${docs}
103+
COMMAND
104+
${CMAKE_SWIFT_COMPILER} -frontend ${flags} -sil-merge-partial-modules -emit-module ${mods} -o ${module} -emit-module-doc-path ${documentation})
105+
endif()
106+
107+
if(AST_LIBRARY)
108+
set(emit_library -emit-library)
109+
endif()
110+
add_custom_command(OUTPUT
111+
${AST_OUTPUT}
112+
DEPENDS
113+
${objs}
114+
COMMAND
115+
${CMAKE_SWIFT_COMPILER} ${emit_library} ${link_flags} -o ${AST_OUTPUT} ${objs}
116+
COMMAND
117+
${CMAKE_COMMAND} -E copy ${AST_OUTPUT} ${CMAKE_CURRENT_BINARY_DIR})
118+
add_custom_target(${target}
119+
ALL
120+
DEPENDS
121+
${AST_OUTPUT}
122+
${module}
123+
${documentation})
124+
endfunction()
125+
126+
function(add_swift_library library)
127+
add_swift_target(${library} LIBRARY ${ARGN})
128+
endfunction()
129+
130+
function(add_swift_executable executable)
131+
add_swift_target(${executable} ${ARGN})
132+
endfunction()
133+

0 commit comments

Comments
 (0)