Skip to content

Commit 9f3d87b

Browse files
committed
build: add a CMake based build for Windows
Given that swift-package-manager is not currently ready for Windows, this addition makes it possible to build for Windows.
1 parent c08d7f7 commit 9f3d87b

File tree

4 files changed

+145
-0
lines changed

4 files changed

+145
-0
lines changed

CMakeLists.txt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
cmake_minimum_required(VERSION 3.16)
2+
3+
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules)
4+
5+
project(swift-log
6+
LANGUAGES Swift)
7+
8+
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
9+
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
10+
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
11+
set(CMAKE_Swift_MODULE_DIRECTORY ${CMAKE_BINARY_DIR}/swift)
12+
13+
include(SwiftSupport)
14+
15+
add_subdirectory(Sources)
16+
17+
export(EXPORT swift-log
18+
NAMESPACE SwiftLog::
19+
FILE swift-log-config.cmake)

Sources/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
add_subdirectory(Logging)

Sources/Logging/CMakeLists.txt

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
add_library(Logging
2+
Locks.swift
3+
Logging.swift
4+
LogHandler.swift)
5+
target_compile_options(Logging PRIVATE
6+
"SHELL:$<$<PLATFORM_ID:Windows>:-Xcc -D_CRT_SECURE_NO_WARNINGS>")
7+
set_target_properties(Logging PROPERTIES
8+
INTERFACE_INCLUDE_DIRECTORIES ${CMAKE_Swift_MODULE_DIRECTORY})
9+
10+
11+
swift_install(TARGETS Logging
12+
EXPORT swift-log)

cmake/modules/SwiftSupport.cmake

Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
2+
include(CMakeParseArguments)
3+
4+
# Returns the architecture name in a variable
5+
#
6+
# Usage:
7+
# swift_get_host_arch(result_var_name)
8+
#
9+
# Sets ${result_var_name} with the converted architecture name derived from
10+
# CMAKE_SYSTEM_PROCESSOR.
11+
function(swift_get_host_arch result_var_name)
12+
if("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86_64")
13+
set("${result_var_name}" "x86_64" PARENT_SCOPE)
14+
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "aarch64")
15+
set("${result_var_name}" "aarch64" PARENT_SCOPE)
16+
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "ppc64")
17+
set("${result_var_name}" "powerpc64" PARENT_SCOPE)
18+
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "ppc64le")
19+
set("${result_var_name}" "powerpc64le" PARENT_SCOPE)
20+
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "s390x")
21+
set("${result_var_name}" "s390x" PARENT_SCOPE)
22+
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "armv6l")
23+
set("${result_var_name}" "armv6" PARENT_SCOPE)
24+
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "armv7l")
25+
set("${result_var_name}" "armv7" PARENT_SCOPE)
26+
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "armv7-a")
27+
set("${result_var_name}" "armv7" PARENT_SCOPE)
28+
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "AMD64")
29+
set("${result_var_name}" "x86_64" PARENT_SCOPE)
30+
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "IA64")
31+
set("${result_var_name}" "itanium" PARENT_SCOPE)
32+
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "x86")
33+
set("${result_var_name}" "i686" PARENT_SCOPE)
34+
elseif("${CMAKE_SYSTEM_PROCESSOR}" STREQUAL "i686")
35+
set("${result_var_name}" "i686" PARENT_SCOPE)
36+
else()
37+
message(FATAL_ERROR "Unrecognized architecture on host system: ${CMAKE_SYSTEM_PROCESSOR}")
38+
endif()
39+
endfunction()
40+
41+
# Returns the os name in a variable
42+
#
43+
# Usage:
44+
# get_swift_host_os(result_var_name)
45+
#
46+
#
47+
# Sets ${result_var_name} with the converted OS name derived from
48+
# CMAKE_SYSTEM_NAME.
49+
function(get_swift_host_os result_var_name)
50+
if(CMAKE_SYSTEM_NAME STREQUAL Darwin)
51+
set(${result_var_name} macosx PARENT_SCOPE)
52+
else()
53+
string(TOLOWER ${CMAKE_SYSTEM_NAME} cmake_system_name_lc)
54+
set(${result_var_name} ${cmake_system_name_lc} PARENT_SCOPE)
55+
endif()
56+
endfunction()
57+
58+
function(swift_install)
59+
set(options)
60+
set(single_parameter_options EXPORT)
61+
set(multiple_parameter_options TARGETS)
62+
63+
cmake_parse_arguments(SI
64+
"${options}"
65+
"${single_parameter_options}"
66+
"${multiple_parameter_options}"
67+
${ARGN})
68+
69+
list(LENGTH ${SI_TARGETS} si_num_targets)
70+
if(si_num_targets GREATER 1)
71+
message(SEND_ERROR "swift_install only supports a single target at a time")
72+
endif()
73+
74+
get_swift_host_os(swift_os)
75+
get_target_property(type ${SI_TARGETS} TYPE)
76+
77+
if(type STREQUAL STATIC_LIBRARY)
78+
set(swift_dir swift_static)
79+
else()
80+
set(swift_dir swift)
81+
endif()
82+
83+
install(TARGETS ${SI_TARGETS}
84+
EXPORT ${SI_EXPORT}
85+
ARCHIVE DESTINATION lib/${swift_dir}/${swift_os}
86+
LIBRARY DESTINATION lib/${swift_dir}/${swift_os}
87+
RUNTIME DESTINATION bin)
88+
if(type STREQUAL EXECUTABLE)
89+
return()
90+
endif()
91+
92+
swift_get_host_arch(swift_arch)
93+
get_target_property(module_name ${SI_TARGETS} Swift_MODULE_NAME)
94+
if(NOT module_name)
95+
set(module_name ${SI_TARGETS})
96+
endif()
97+
98+
if(CMAKE_SYSTEM_NAME STREQUAL Darwin)
99+
install(FILES
100+
$<TARGET_PROPERTY:${SI_TARGETS},Swift_MODULE_DIRECTORY>/${module_name}.swiftdoc
101+
DESTINATION lib/${swift_dir}/${swift_os}/${module_name}.swiftmodule
102+
RENAME ${swift_arch}.swiftdoc)
103+
install(FILES
104+
$<TARGET_PROPERTY:${SI_TARGETS},Swift_MODULE_DIRECTORY>/${module_name}.swiftmodule
105+
DESTINATION lib/${swift_dir}/${swift_os}/${module_name}.swiftmodule
106+
RENAME ${swift_arch}.swiftmodule)
107+
else()
108+
install(FILES
109+
$<TARGET_PROPERTY:${SI_TARGETS},Swift_MODULE_DIRECTORY>/${module_name}.swiftdoc
110+
$<TARGET_PROPERTY:${SI_TARGETS},Swift_MODULE_DIRECTORY>/${module_name}.swiftmodule
111+
DESTINATION lib/${swift_dir}/${swift_os}/${swift_arch})
112+
endif()
113+
endfunction()

0 commit comments

Comments
 (0)