mirror of
https://github.com/fish-shell/fish-shell
synced 2024-12-26 21:03:12 +00:00
31d7f197b1
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.
98 lines
2.6 KiB
CMake
98 lines
2.6 KiB
CMake
cmake_minimum_required(VERSION 3.5)
|
|
|
|
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
|
|
|
|
project(fish LANGUAGES C)
|
|
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
|
|
|
set(DEFAULT_BUILD_TYPE "RelWithDebInfo")
|
|
|
|
# Generate Xcode schemas (but not for tests).
|
|
set(CMAKE_XCODE_GENERATE_SCHEME 1)
|
|
|
|
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()
|
|
|
|
# Set up standard directories.
|
|
include(GNUInstallDirs)
|
|
add_definitions(-D_UNICODE=1)
|
|
|
|
include(cmake/gettext.cmake)
|
|
|
|
# Set up PCRE2
|
|
# This sets an environment variable that needs to be available before the Rust stanzas
|
|
include(cmake/PCRE2.cmake)
|
|
|
|
include(cmake/Rust.cmake)
|
|
|
|
# Work around issue where archive-built libs go in the wrong place.
|
|
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR})
|
|
|
|
if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR)
|
|
set(FISH_IN_TREE_BUILD TRUE)
|
|
else()
|
|
set(FISH_IN_TREE_BUILD FALSE)
|
|
endif()
|
|
|
|
# Set up the machinery around FISH-BUILD-VERSION-FILE
|
|
# This defines the FBVF variable.
|
|
include(Version)
|
|
|
|
# Let fish pick up when we're running out of the build directory without installing
|
|
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}")
|
|
|
|
# Define a function to build and link dependencies.
|
|
function(CREATE_TARGET target)
|
|
add_custom_target(
|
|
${target} ALL
|
|
COMMAND
|
|
"${CMAKE_COMMAND}" -E
|
|
env ${VARS_FOR_CARGO}
|
|
${Rust_CARGO}
|
|
build --bin ${target}
|
|
$<$<CONFIG:Release>:--release>
|
|
$<$<CONFIG:RelWithDebInfo>:--release>
|
|
--target ${Rust_CARGO_TARGET}
|
|
${CARGO_FLAGS}
|
|
${FEATURES_ARG}
|
|
&&
|
|
"${CMAKE_COMMAND}" -E
|
|
copy "${rust_target_dir}/${rust_profile}/${target}" "${CMAKE_CURRENT_BINARY_DIR}"
|
|
WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
|
|
USES_TERMINAL
|
|
)
|
|
endfunction(CREATE_TARGET)
|
|
|
|
# Define fish.
|
|
create_target(fish)
|
|
|
|
# Define fish_indent.
|
|
create_target(fish_indent)
|
|
|
|
# Define fish_key_reader.
|
|
create_target(fish_key_reader)
|
|
|
|
# Set up the docs.
|
|
include(cmake/Docs.cmake)
|
|
|
|
# A helper for running tests.
|
|
add_executable(fish_test_helper src/fish_test_helper.c)
|
|
# Set up tests.
|
|
include(cmake/Tests.cmake)
|
|
|
|
# Benchmarking support.
|
|
include(cmake/Benchmark.cmake)
|
|
|
|
# Set up install.
|
|
include(cmake/Install.cmake)
|
|
|
|
# Mac app.
|
|
include(cmake/MacApp.cmake)
|
|
|
|
include(FeatureSummary)
|
|
feature_summary(WHAT ALL)
|