2024-08-04 16:18:06 +08:00
|
|
|
cmake_minimum_required(VERSION 3.5)
|
2018-01-13 22:58:29 +08:00
|
|
|
|
2024-01-25 19:58:50 +08:00
|
|
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
|
|
|
|
|
2024-06-11 22:53:01 +08:00
|
|
|
project(fish LANGUAGES C)
|
2020-04-02 00:33:31 +08:00
|
|
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
2017-09-01 04:24:20 +08:00
|
|
|
|
Switch default build type back to RelWithDebInfo for now
A release build is recommended to most users (to avoid occasional slowness)
whereas developers may prefer debug builds for shorter build times and more
accurate debug information.
There are more users of "make install" than developers, so I think the
default should be optimized for users, i.e. an optimized build. I think
that's in line with what most of our peer projects do.
Even if developers don't know about the -DCMAKE_BUILD_TYPE=Debug
trick, they will likely be able to iterate quickly by using "cargo
{build,check,clippy,test}" and rust-analyzer, all of which use a debug
configuration by default, irrespective of cmake. Granted, users will need
to use cmake to run system tests. If a task needs a lot of iterations,
one can always convert the system test to a script that can be run with
target/build/fish. For building & running all system tests, the release
build takes 30% longer, so not that much.
Here are my build/test times and binary sizes; with debug:
$ time ninja -C build-Debug/
________________________________________________________
Executed in 25.30 secs fish external
usr time 68.33 secs 676.00 micros 68.32 secs
sys time 11.34 secs 41.00 micros 11.34 secs
$ du -h build-Debug/fish
43M build-Debug/fish
$ time ninja -C build-Debug/ test
________________________________________________________
Executed in 193.96 secs fish external
usr time 182.84 secs 1.53 millis 182.83 secs
sys time 30.97 secs 0.00 millis 30.97 secs
with release
$ time ninja -C build-RelWithDebInfo/
________________________________________________________
Executed in 106.80 secs fish external
usr time 164.98 secs 631.00 micros 164.98 secs
sys time 11.62 secs 41.00 micros 11.62 secs
$ du -h build-RelWithDebInfo/fish
4.6M build-RelWithDebInfo/fish
$ time ninja -C build-RelWithDebInfo/ test
________________________________________________________
Executed in 249.87 secs fish external
usr time 260.25 secs 1.43 millis 260.25 secs
sys time 29.86 secs 0.00 millis 29.86 secs
Tangentially related, the numbers with "lto = true" deleted. This seems
like a nice compromise for a default but I don't know much about the other
benefits of lto.
$ time ninja -C build-RelWithDebInfo-thin-lto/
________________________________________________________
Executed in 35.50 secs fish external
usr time 196.93 secs 0.00 micros 196.93 secs
sys time 13.00 secs 969.00 micros 13.00 secs
$ du -h build-RelWithDebInfo-thin-lto/fish
5.5M build-RelWithDebInfo-thin-lto/fish
$ time ninja -C build-RelWithDebInfo-thin-lto/ test
________________________________________________________
Executed in 178.62 secs fish external
usr time 287.48 secs 976.00 micros 287.48 secs
sys time 28.75 secs 115.00 micros 28.75 secs
Alternative solution: have no default at all, and error out until the user
chooses a build type.
2024-10-20 03:13:41 +08:00
|
|
|
set(DEFAULT_BUILD_TYPE "RelWithDebInfo")
|
2018-06-18 13:21:23 +08:00
|
|
|
|
2021-09-19 13:09:31 +08:00
|
|
|
# Generate Xcode schemas (but not for tests).
|
|
|
|
set(CMAKE_XCODE_GENERATE_SCHEME 1)
|
|
|
|
|
2020-03-15 07:11:35 +08:00
|
|
|
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
|
|
|
|
message(STATUS "Setting build type to default '${DEFAULT_BUILD_TYPE}'")
|
|
|
|
set(CMAKE_BUILD_TYPE "${DEFAULT_BUILD_TYPE}")
|
|
|
|
endif()
|
2017-09-01 04:24:20 +08:00
|
|
|
|
2024-01-11 00:41:34 +08:00
|
|
|
# Set up standard directories.
|
|
|
|
include(GNUInstallDirs)
|
|
|
|
add_definitions(-D_UNICODE=1)
|
|
|
|
|
2024-01-04 03:02:32 +08:00
|
|
|
include(cmake/gettext.cmake)
|
|
|
|
|
2024-01-13 14:17:50 +08:00
|
|
|
# Set up PCRE2
|
|
|
|
# This sets an environment variable that needs to be available before the Rust stanzas
|
|
|
|
include(cmake/PCRE2.cmake)
|
|
|
|
|
2023-01-15 06:56:24 +08:00
|
|
|
include(cmake/Rust.cmake)
|
|
|
|
|
2019-02-01 07:56:27 +08:00
|
|
|
# Work around issue where archive-built libs go in the wrong place.
|
2020-03-15 07:11:35 +08:00
|
|
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
|
2019-02-01 07:56:27 +08:00
|
|
|
|
2020-03-15 07:11:35 +08:00
|
|
|
if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)
|
|
|
|
set(FISH_IN_TREE_BUILD TRUE)
|
|
|
|
else()
|
|
|
|
set(FISH_IN_TREE_BUILD FALSE)
|
|
|
|
endif()
|
2018-01-23 17:35:38 +08:00
|
|
|
|
2018-01-08 17:39:45 +08:00
|
|
|
# Set up the machinery around FISH-BUILD-VERSION-FILE
|
|
|
|
# This defines the FBVF variable.
|
2020-03-15 07:11:35 +08:00
|
|
|
include(Version)
|
2018-01-08 17:39:45 +08:00
|
|
|
|
2018-10-14 10:36:59 +08:00
|
|
|
# Let fish pick up when we're running out of the build directory without installing
|
2020-03-15 07:11:35 +08:00
|
|
|
get_filename_component(REAL_CMAKE_BINARY_DIR "${CMAKE_BINARY_DIR}" REALPATH)
|
|
|
|
get_filename_component(REAL_CMAKE_SOURCE_DIR "${CMAKE_SOURCE_DIR}" REALPATH)
|
|
|
|
add_definitions(-DCMAKE_BINARY_DIR="${REAL_CMAKE_BINARY_DIR}")
|
|
|
|
add_definitions(-DCMAKE_SOURCE_DIR="${REAL_CMAKE_SOURCE_DIR}")
|
2018-10-14 10:36:59 +08:00
|
|
|
|
2024-07-08 02:30:28 +08:00
|
|
|
# Define a function to build and link dependencies.
|
|
|
|
function(CREATE_TARGET target)
|
2024-03-24 17:46:52 +08:00
|
|
|
add_custom_target(
|
|
|
|
${target} ALL
|
|
|
|
COMMAND
|
|
|
|
"${CMAKE_COMMAND}" -E
|
|
|
|
env ${VARS_FOR_CARGO}
|
|
|
|
${Rust_CARGO}
|
|
|
|
build --bin ${target}
|
2024-08-04 19:00:00 +08:00
|
|
|
$<$<CONFIG:Release>:--release>
|
|
|
|
$<$<CONFIG:RelWithDebInfo>:--release>
|
2024-03-24 17:46:52 +08:00
|
|
|
--target ${Rust_CARGO_TARGET}
|
|
|
|
${CARGO_FLAGS}
|
|
|
|
${FEATURES_ARG}
|
|
|
|
&&
|
|
|
|
"${CMAKE_COMMAND}" -E
|
|
|
|
copy "${rust_target_dir}/${rust_profile}/${target}" "${CMAKE_CURRENT_BINARY_DIR}"
|
2024-01-25 19:58:50 +08:00
|
|
|
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
|
|
|
USES_TERMINAL
|
|
|
|
)
|
2024-07-08 02:30:28 +08:00
|
|
|
endfunction(CREATE_TARGET)
|
2017-09-01 04:24:20 +08:00
|
|
|
|
|
|
|
# Define fish.
|
2024-07-08 02:30:28 +08:00
|
|
|
create_target(fish)
|
2017-09-01 04:24:20 +08:00
|
|
|
|
2017-09-09 06:19:07 +08:00
|
|
|
# Define fish_indent.
|
2024-07-08 02:30:28 +08:00
|
|
|
create_target(fish_indent)
|
2017-09-09 06:19:07 +08:00
|
|
|
|
|
|
|
# Define fish_key_reader.
|
2024-07-08 02:30:28 +08:00
|
|
|
create_target(fish_key_reader)
|
2017-09-09 06:19:07 +08:00
|
|
|
|
2019-03-15 04:50:35 +08:00
|
|
|
# Set up the docs.
|
2020-03-15 07:11:35 +08:00
|
|
|
include(cmake/Docs.cmake)
|
2019-03-15 04:50:35 +08:00
|
|
|
|
2019-04-07 13:22:11 +08:00
|
|
|
# A helper for running tests.
|
2024-06-11 22:53:01 +08:00
|
|
|
add_executable(fish_test_helper src/fish_test_helper.c)
|
2017-09-01 15:31:51 +08:00
|
|
|
# Set up tests.
|
2020-03-15 07:11:35 +08:00
|
|
|
include(cmake/Tests.cmake)
|
2017-10-05 11:45:48 +08:00
|
|
|
|
2019-04-11 05:30:31 +08:00
|
|
|
# Benchmarking support.
|
2020-03-15 07:11:35 +08:00
|
|
|
include(cmake/Benchmark.cmake)
|
2019-04-11 05:30:31 +08:00
|
|
|
|
2017-10-05 11:45:48 +08:00
|
|
|
# Set up install.
|
2020-03-15 07:11:35 +08:00
|
|
|
include(cmake/Install.cmake)
|
2017-11-13 22:21:54 +08:00
|
|
|
|
2019-01-26 10:43:52 +08:00
|
|
|
# Mac app.
|
2020-03-15 07:11:35 +08:00
|
|
|
include(cmake/MacApp.cmake)
|
2019-01-26 10:43:52 +08:00
|
|
|
|
2020-03-15 07:11:35 +08:00
|
|
|
include(FeatureSummary)
|
|
|
|
feature_summary(WHAT ALL)
|