this repo has no description
1cmake_minimum_required(VERSION 3.13)
2
3SET(CMAKE_SYSTEM_NAME Linux)
4SET(CMAKE_SYSTEM_PROCESSOR "x86-64")
5
6# This allows setting the compiler with -DCMAKE_C_COMPILER when configuring.
7if (NOT DEFINED CMAKE_C_COMPILER)
8 find_program(CMAKE_C_COMPILER NAMES
9 "clang"
10 "clang-4.0"
11 "clang-6.0"
12 "clang-7"
13 "clang-9"
14 "clang-10"
15 "clang-11"
16 "clang-12"
17 "clang-13"
18 "clang-14"
19 "clang-15"
20)
21endif(NOT DEFINED CMAKE_C_COMPILER)
22
23if (NOT DEFINED CMAKE_CXX_COMPILER)
24 find_program(CMAKE_CXX_COMPILER NAMES
25 "clang++"
26 "clang++-4.0"
27 "clang++-6.0"
28 "clang++-7"
29 "clang++-9"
30 "clang++-10"
31 "clang++-11"
32 "clang++-12"
33 "clang++-13"
34 "clang++-14"
35 "clang++-15"
36)
37endif(NOT DEFINED CMAKE_CXX_COMPILER)
38
39option(DARLING_NO_CCACHE "Disable ccache usage" OFF)
40
41find_program(CCACHE_PROGRAM ccache)
42if(CCACHE_PROGRAM AND NOT DARLING_NO_CCACHE)
43 set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE "${CCACHE_PROGRAM}")
44endif()
45
46SET(CMAKE_SKIP_RPATH TRUE)
47
48# technically ignored by CMake when building on non-Apple platforms, but it's already a standard variable for the
49# SDK deployment target, so we'll just use it and then add it to the compiler flags manually
50set(CMAKE_OSX_DEPLOYMENT_TARGET 11.0 CACHE STRING "The version of macOS we're simulating")
51
52project(darling)
53
54enable_language(ASM)
55
56set(CMAKE_INSTALL_DEFAULT_COMPONENT_NAME "core")
57
58set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
59include(clang_version_check)
60include(InstallSymlink)
61include(MacroEnsureOutOfSourceBuild)
62include(dsym)
63include(xcproj)
64include(architecture)
65include(create_symlink)
66
67set(CLANG_RECOMMENDED_MINIMUM_VERSION 11)
68clang_version_check(${CMAKE_C_COMPILER} c ${CLANG_RECOMMENDED_MINIMUM_VERSION})
69clang_version_check(${CMAKE_CXX_COMPILER} cpp ${CLANG_RECOMMENDED_MINIMUM_VERSION})
70
71MACRO_ENSURE_OUT_OF_SOURCE_BUILD()
72
73set(DARLING_TOP_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}")
74set(DARLING_NO_EXECUTABLES OFF)
75set(CMAKE_C_IMPLICIT_LINK_LIBRARIES "")
76set(CMAKE_CXX_IMPLICIT_LINK_LIBRARIES "")
77
78if (${CMAKE_HOST_SYSTEM_PROCESSOR} MATCHES "i686|i386")
79 message(FATAL_ERROR "This software can only be built on x86-64 systems")
80endif (${CMAKE_HOST_SYSTEM_PROCESSOR} MATCHES "i686|i386")
81
82SET(IGNORED_WARNINGS "-Wno-nullability-completeness -Wno-deprecated-declarations -Wno-availability")
83
84if (${CMAKE_C_COMPILER_ID} STREQUAL "Clang" AND NOT ${CMAKE_C_COMPILER_VERSION} VERSION_LESS "3.9")
85 SET(IGNORED_WARNINGS "${IGNORED_WARNINGS} -Wno-expansion-to-defined")
86endif (${CMAKE_C_COMPILER_ID} STREQUAL "Clang" AND NOT ${CMAKE_C_COMPILER_VERSION} VERSION_LESS "3.9")
87
88if(${CMAKE_C_COMPILER_ID} STREQUAL "Clang" AND ${CMAKE_C_COMPILER_VERSION} VERSION_GREATER_EQUAL "11")
89 # newer Clang chokes on the idiomatic way to use CF_ENUM; e.g. like this:
90 # typedef CF_ENUM(int, MyEnum) {
91 # MY_ENUM_THING,
92 # MY_ENUM_OTHER_THING,
93 # # etc...
94 # }
95 set(IGNORED_WARNINGS "${IGNORED_WARNINGS} -Wno-elaborated-enum-base -Wno-undef-prefix")
96 set(ASM_IGNORED_WARNINGS "${ASM_IGNORED_WARNINGS} -Wno-undef-prefix")
97endif()
98
99SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${IGNORED_WARNINGS}")
100SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${IGNORED_WARNINGS}")
101set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS} ${ASM_IGNORED_WARNINGS}")
102SET(CMAKE_C_FLAGS_DEBUG "-O0 -ggdb")
103SET(CMAKE_CXX_FLAGS_DEBUG "-O0 -ggdb")
104
105# prevent object filename conflicts for two source files that differ only in extension (e.g. `object.c` and `object.m`)
106set(CMAKE_C_OUTPUT_EXTENSION ".c.o")
107set(CMAKE_CXX_OUTPUT_EXTENSION ".cpp.o")
108set(CMAKE_OBJC_OUTPUT_EXTENSION ".m.o")
109
110if(CMAKE_POSITION_INDEPENDENT_CODE)
111 SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC")
112 SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
113 SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pie")
114endif(CMAKE_POSITION_INDEPENDENT_CODE)
115
116enable_language(ASM-ATT)
117
118option(TARGET_i386 "Enable i386 slices" ON)
119option(TARGET_x86_64 "Enable x86_64 slices" ON)
120option(DEBIAN_PACKAGING "Packaging for Debian" OFF)
121option(ENABLE_TESTS "Install in-prefix unit tests" OFF)
122option(REGENERATE_SDK "Regenerate Header Files For Open Source SDK" OFF)
123
124if (DEBIAN_PACKAGING)
125 set(COMPONENTS_DEFAULT "all")
126else()
127 set(COMPONENTS_DEFAULT "stock")
128endif()
129
130set(COMPONENTS "${COMPONENTS_DEFAULT}" CACHE STRING "Choose which components of Darling to build")
131include(darling_parse_components)
132darling_parse_components("${COMPONENTS}")
133
134set(COMPILE_PY2_BYTECODE AUTO CACHE STRING "Pre-compile bytecode for Python 2 packages")
135set_property(CACHE COMPILE_PY2_BYTECODE PROPERTY STRINGS AUTO ON OFF)
136
137string(TOLOWER "${COMPILE_PY2_BYTECODE}" COMPILE_PY2_BYTECODE)
138
139if (COMPILE_PY2_BYTECODE STREQUAL "auto")
140 find_package(Python2 QUIET COMPONENTS Interpreter)
141
142 if (Python2_Interpreter_FOUND)
143 set(COMPILE_PY2_BYTECODE ON)
144 message("Found Python 2; enabling pre-compilation of Python bytecode")
145 else()
146 set(COMPILE_PY2_BYTECODE OFF)
147 message("Python 2 not available; bytecode compilation is disabled")
148 endif (Python2_Interpreter_FOUND)
149endif (COMPILE_PY2_BYTECODE STREQUAL "auto")
150
151if (COMPILE_PY2_BYTECODE)
152 find_package(Python2 REQUIRED COMPONENTS Interpreter)
153endif (COMPILE_PY2_BYTECODE)
154
155set(ENABLE_METAL AUTO CACHE STRING "Build Darling with Metal support")
156set_property(CACHE ENABLE_METAL PROPERTY STRINGS AUTO ON OFF)
157
158string(TOLOWER "${ENABLE_METAL}" BUILD_METAL)
159
160if(BUILD_METAL STREQUAL "auto")
161 # check if Vulkan and LLVM are available
162 find_program(LLVM_CONFIG_PROGRAM llvm-config)
163 find_package(Vulkan)
164
165 if(LLVM_CONFIG_PROGRAM AND Vulkan_FOUND)
166 set(BUILD_METAL ON)
167 message("Found required libraries; building with Metal support")
168 else()
169 set(BUILD_METAL OFF)
170 message("Did not find required libraries (Vulkan and LLVM); building without Metal support")
171 endif()
172endif()
173
174FindDsymutil()
175find_package(Setcap REQUIRED)
176
177# Missing CMakeLists.txt must trigger an error
178cmake_policy(SET CMP0014 NEW)
179
180generate_architecture()
181
182add_subdirectory(src)
183
184install(DIRECTORY DESTINATION libexec/darling/private)
185install(DIRECTORY DESTINATION libexec/darling/private/etc)
186install(DIRECTORY DESTINATION libexec/darling/private/var)
187install(DIRECTORY DESTINATION libexec/darling/private/tmp)
188InstallSymlink(private/etc ${CMAKE_INSTALL_PREFIX}/libexec/darling/etc)
189InstallSymlink(private/var ${CMAKE_INSTALL_PREFIX}/libexec/darling/var)
190
191install(FILES etc/resolv.conf
192 DESTINATION libexec/darling/private/etc)
193InstallSymlink(/Volumes/SystemRoot/etc/machine-id ${CMAKE_INSTALL_PREFIX}/libexec/darling/private/etc/machine-id)
194InstallSymlink(/Volumes/SystemRoot/etc/nsswitch.conf ${CMAKE_INSTALL_PREFIX}/libexec/darling/private/etc/nsswitch.conf)
195
196install(DIRECTORY DESTINATION libexec/darling/Volumes)
197install(DIRECTORY DESTINATION libexec/darling/Volumes/SystemRoot)
198InstallSymlink(/ ${CMAKE_INSTALL_PREFIX}/libexec/darling/Volumes/DarlingEmulatedDrive)
199
200install(DIRECTORY DESTINATION libexec/darling/proc)
201
202install(DIRECTORY DESTINATION libexec/darling/var/root)
203install(DIRECTORY DESTINATION libexec/darling/var/run)
204InstallSymlink(/dev/log ${CMAKE_INSTALL_PREFIX}/libexec/darling/var/run/syslog)
205
206install(DIRECTORY DESTINATION libexec/darling/usr)
207install(DIRECTORY DESTINATION libexec/darling/usr/local)
208install(DIRECTORY DESTINATION libexec/darling/usr/local/share)
209
210InstallSymlink(/Volumes/SystemRoot/dev ${CMAKE_INSTALL_PREFIX}/libexec/darling/dev)
211InstallSymlink(private/tmp ${CMAKE_INSTALL_PREFIX}/libexec/darling/tmp)
212
213InstallSymlink(/proc/self/mounts ${CMAKE_INSTALL_PREFIX}/libexec/darling/private/etc/mtab)
214#InstallSymlink(/Volumes/SystemRoot/etc/passwd ${CMAKE_INSTALL_PREFIX}/libexec/darling/private/etc/passwd)
215#InstallSymlink(/Volumes/SystemRoot/etc/group ${CMAKE_INSTALL_PREFIX}/libexec/darling/private/etc/group)
216InstallSymlink(/Volumes/SystemRoot/etc/localtime ${CMAKE_INSTALL_PREFIX}/libexec/darling/private/etc/localtime)
217
218InstallSymlink(/Volumes/SystemRoot/usr/share/zoneinfo ${CMAKE_INSTALL_PREFIX}/libexec/darling/usr/share/zoneinfo)
219
220install(DIRECTORY DESTINATION libexec/darling/Library/Preferences)
221
222if(NOT DEBIAN_PACKAGING)
223 install(CODE "execute_process(COMMAND bash ${DARLING_TOP_DIRECTORY}/tools/shutdown-user.sh)")
224endif(NOT DEBIAN_PACKAGING)
225
226add_custom_target(uninstall
227 COMMAND ${CMAKE_CURRENT_SOURCE_DIR}/tools/uninstall
228 COMMENT "Uninstall Darling and kernel module")