Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CMake: fix missing SWIFT_CONCURRENCY_GLOBAL_EXECUTOR value #65795

Merged
merged 4 commits into from
May 17, 2023
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,10 @@ set(SWIFT_HOST_VARIANT_ARCH "${SWIFT_HOST_VARIANT_ARCH_default}" CACHE STRING
# This is primarily to support building smaller or faster project files.
#

# Subsequent options may refer to `StdlibOptions`, which have to be defined first.
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR}/stdlib/cmake/modules)
include(StdlibOptions)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Instead of including StdlibOptions here, why don't we move the following into StdlibOptions?

# Use dispatch as the system scheduler by default.
# For convenience, we set this to false when concurrency is disabled.
set(SWIFT_CONCURRENCY_USES_DISPATCH FALSE)
if(SWIFT_ENABLE_EXPERIMENTAL_CONCURRENCY AND "${SWIFT_CONCURRENCY_GLOBAL_EXECUTOR}" STREQUAL "dispatch")
  set(SWIFT_CONCURRENCY_USES_DISPATCH TRUE)
endif()

AFAICT it is only used in the stdlib build, so really has no business being set in the root CMakeLists.txt

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

^ Was just thinking that.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good point, that's addressed now.


option(SWIFT_APPEND_VC_REV
"Embed the version control system revision in Swift"
TRUE)
Expand Down
3 changes: 1 addition & 2 deletions test/Driver/static-stdlib-autolink-linux.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,7 @@
// RUN: echo 'public func asyncFunc() async { print("Hello") }' > %t/asyncModule.swift

// RUN: %target-swiftc_driver -emit-library -emit-module -module-name asyncModule -module-link-name asyncModule %t/asyncModule.swift -static -static-stdlib -o %t/libasyncModule.a
// TODO: "-ldispatch -lBlocksRuntime" should be told by asyncModule.swiftmodule transitively
// RUN: %target-swiftc_driver -parse-as-library -static -static-stdlib -module-name main %s %import-static-libdispatch -I%t -L%t -ldispatch -lBlocksRuntime -o %t/main
// RUN: %target-swiftc_driver -parse-as-library -static -static-stdlib -module-name main %s %import-static-libdispatch -I%t -L%t -o %t/main

// RUN: %t/main | %FileCheck %s
// CHECK: Hello
Expand Down
2 changes: 1 addition & 1 deletion test/Driver/static-stdlib-linux.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
// REQUIRES: static_stdlib
print("hello world!")
// RUN: %empty-directory(%t)
// RUN: %target-swiftc_driver -static-stdlib -o %t/static-stdlib %s
// RUN: %target-swiftc_driver %import-static-libdispatch -static-stdlib -o %t/static-stdlib %s
// RUN: %t/static-stdlib | %FileCheck %s
// RUN: ldd %t/static-stdlib | %FileCheck %s --check-prefix=LDD
// CHECK: hello world!
Expand Down
18 changes: 8 additions & 10 deletions test/lit.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -1593,19 +1593,13 @@ elif (run_os in ['linux-gnu', 'linux-gnueabihf', 'freebsd', 'openbsd', 'windows-
config.import_libdispatch = ('-I %s -I %s -L %s'
% (libdispatch_source_dir, libdispatch_swift_module_dir, libdispatch_artifact_dir))

libdispatch_static_artifact_dir = config.libdispatch_static_build_path
libdispatch_swift_static_module_dir = make_path(libdispatch_static_artifact_dir, 'src', 'swift', 'swift')
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Overlay path deleted as unused.

libdispatch_static_artifact_dir = os.path.join(config.libdispatch_static_build_path, 'lib')
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Added a lib component for easier reuse of this variable in subsequent expressions below this line.

libdispatch_static_artifacts = [
make_path(libdispatch_static_artifact_dir, 'src', 'libdispatch.a'),
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Built artifacts are located in lib, not src.

make_path(libdispatch_static_artifact_dir, 'src', 'swift', 'libswiftDispatch.a'),
make_path(libdispatch_swift_static_module_dir, 'Dispatch.swiftmodule')]
Comment on lines -1600 to -1601
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We don't need a Swift overlay for Dispatch to statically linked a simple executable, Dispatch is used directly without an overlay from the concurrency runtime.

make_path(libdispatch_static_artifact_dir, 'libdispatch.a'),
make_path(libdispatch_static_artifact_dir, 'libBlocksRuntime.a')]
if (all(os.path.exists(p) for p in libdispatch_static_artifacts)):
config.available_features.add('libdispatch_static')
config.import_libdispatch_static = ('-I %s -I %s -L %s -L %s -L %s'
% (libdispatch_source_dir, libdispatch_swift_static_module_dir,
make_path(libdispatch_static_artifact_dir, 'src'),
make_path(libdispatch_static_artifact_dir, 'src', 'BlocksRuntime'),
make_path(libdispatch_static_artifact_dir, 'src', 'swift')))
config.import_libdispatch_static = '-L %s' % libdispatch_static_artifact_dir
Comment on lines -1604 to +1602
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since neither the overlay nor the headers are used for static linking, this is simplified to a single library search path flag.


config.target_build_swift = (
'%s -target %s -toolchain-stdlib-rpath %s %s %s %s %s'
Expand Down Expand Up @@ -2649,6 +2643,10 @@ run_filecheck = '%s %s --allow-unused-prefixes --sanitize BUILD_DIR=%s --sanitiz
config.substitutions.append(('%FileCheck', run_filecheck))
config.substitutions.append(('%raw-FileCheck', shell_quote(config.filecheck)))
config.substitutions.append(('%import-libdispatch', getattr(config, 'import_libdispatch', '')))
# WARNING: the order of components in a substitution name has to be different from the previous one, as lit does
# a pure string substitution without understanding that these components are grouped together. That is, the following
# subsitution name can't be `%import-libdispatch-static`, otherwise the first two components will be substituted with
# the value of `%import-libdispatch` substitution with `-static` string appended to it.
config.substitutions.append(('%import-static-libdispatch', getattr(config, 'import_libdispatch_static', '')))
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

While working on this fix I attempted to rename this to %import-libdispatch-static for consistency, which led to a hard to debug test failure due to incorrect flags passed. Added a note about this substitution behavior for posterity.


# Disable COW sanity checks in the swift runtime by default.
Expand Down
2 changes: 1 addition & 1 deletion utils/build-script-impl
Original file line number Diff line number Diff line change
Expand Up @@ -1901,7 +1901,7 @@ for host in "${ALL_HOSTS[@]}"; do
-DSWIFT_PATH_TO_CMARK_BUILD:PATH="$(build_directory ${host} cmark)"
-DSWIFT_PATH_TO_LIBDISPATCH_SOURCE:PATH="${LIBDISPATCH_SOURCE_DIR}"
-DSWIFT_PATH_TO_LIBDISPATCH_BUILD:PATH="$(build_directory ${host} libdispatch)"
-DSWIFT_PATH_TO_LIBDISPATCH_STATIC_BUILD:PATH="$(build_directory ${host} libdispatch_static)"
-DSWIFT_PATH_TO_LIBDISPATCH_STATIC_BUILD:PATH="$(build_directory ${host} swift)/$(basename $(build_directory ${host} libdispatch))-static-prefix"
Copy link
Contributor Author

@MaxDesiatov MaxDesiatov May 10, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Dispatch built as a dependency of the Swift compiler is located in the Swift build subdirectory, not in its own directory at the top level of the build. It also has that -static-prefix suffix (sic), which I haven't found where it's coming from, seems like it isn't passed to build-script-impl itself, so I'm hardcoding that suffix here for now.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

IIRC, this is the dispatch built for the concurrency runtime. I think this will work for this use-case, but it is probably worth noting.

Copy link
Contributor Author

@MaxDesiatov MaxDesiatov May 10, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For concurrency runtime and SourceKit IIUC

)

if [[ "${SWIFT_SDKS}" ]] ; then
Expand Down