fish-shell/CMakeLists.txt

132 lines
4.7 KiB
CMake
Raw Normal View History

CMAKE_MINIMUM_REQUIRED(VERSION 3.2)
PROJECT(fish-shell CXX)
# We are C++11.
SET(CMAKE_CXX_STANDARD 11)
Work around cmake/ninja bug that leads to installation failure CMake originally links build artifacts/results so that they can run from the target directory. As a result, it must first relink the binaries before installation so that they can run from the installation target directory, typically done in the preinstall stage. Ninja does not have a preinstall stage, and the CMake code that generates the build.ninja file does not take that into account [0]. Setting `CMAKE_BUILD_WITH_INSTALL_RPATH` [1] makes it originally link the files with the RPATH settings for the final destination directory, meaning that relinking is no longer needed. Technically setting the RPATH is not required for the `fish` binary as we do not have any relative dependencies; this is the output of `ldd ./build/fish`: ``` linux-vdso.so.1 => (0x00007ffffacdc000) libncurses.so.5 => /lib/x86_64-linux-gnu/libncurses.so.5 (0x00007f6632350000) libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f6632120000) libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f6631f00000) libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f6631b70000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f6631860000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f6631630000) libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f6631410000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f6631040000) /lib64/ld-linux-x86-64.so.2 (0x00007f6632600000) ``` However, since the bug only exists when the build generator is set to ninja, the workaround is only activated for that specific build generator to prevent any future problems. [0]: https://cmake.org/Bug/print_bug_page.php?bug_id=13934 [1]: https://cmake.org/cmake/help/v3.0/variable/CMAKE_BUILD_WITH_INSTALL_RPATH.html
2017-12-29 05:11:20 +08:00
# Work around cmake/ninja bug that fails on install with ninja
# See https://cmake.org/Bug/print_bug_page.php?bug_id=13934
if (NINJA)
SET(CMAKE_BUILD_WITH_INSTALL_RPATH 1)
endif(NINJA)
# Disable exception handling.
ADD_COMPILE_OPTIONS(-fno-exceptions)
# Hide the CMake Rules directories in Xcode projects.
SOURCE_GROUP("CMake Rules" REGULAR_EXPRESSION "^$")
# Put source and header files at top level under targets.
SOURCE_GROUP("Source Files" REGULAR_EXPRESSION "^$")
SOURCE_GROUP("Header Files" REGULAR_EXPRESSION "^$")
SOURCE_GROUP("Builtins" REGULAR_EXPRESSION "builtin_.*")
# Support folders.
SET_PROPERTY(GLOBAL PROPERTY USE_FOLDERS ON)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_LIST_DIR}/cmake")
# All objects that the system needs to build fish, except fish.cpp
SET(FISH_SRCS
src/autoload.cpp src/builtin.cpp src/builtin_bg.cpp src/builtin_bind.cpp
src/builtin_block.cpp src/builtin_builtin.cpp src/builtin_cd.cpp
src/builtin_command.cpp src/builtin_commandline.cpp
src/builtin_complete.cpp src/builtin_contains.cpp src/builtin_disown.cpp
src/builtin_echo.cpp src/builtin_emit.cpp src/builtin_exit.cpp
src/builtin_fg.cpp src/builtin_function.cpp src/builtin_functions.cpp
src/builtin_argparse.cpp src/builtin_history.cpp src/builtin_jobs.cpp
src/builtin_math.cpp src/builtin_printf.cpp src/builtin_pwd.cpp
src/builtin_random.cpp src/builtin_read.cpp src/builtin_realpath.cpp
src/builtin_return.cpp src/builtin_set.cpp src/builtin_set_color.cpp
src/builtin_source.cpp src/builtin_status.cpp src/builtin_string.cpp
src/builtin_test.cpp src/builtin_ulimit.cpp src/builtin_wait.cpp
src/color.cpp src/common.cpp src/complete.cpp src/env.cpp
src/env_universal_common.cpp src/event.cpp src/exec.cpp src/expand.cpp
src/fallback.cpp src/fish_version.cpp src/function.cpp src/highlight.cpp
src/history.cpp src/input.cpp src/input_common.cpp src/intern.cpp src/io.cpp
src/iothread.cpp src/kill.cpp src/output.cpp src/pager.cpp
src/parse_execution.cpp src/parse_productions.cpp src/parse_tree.cpp
src/parse_util.cpp src/parser.cpp src/parser_keywords.cpp src/path.cpp
src/postfork.cpp src/proc.cpp src/reader.cpp src/sanity.cpp src/screen.cpp
src/signal.cpp src/tokenizer.cpp src/utf8.cpp src/util.cpp
src/wcstringutil.cpp src/wgetopt.cpp src/wildcard.cpp src/wutil.cpp
)
# Header files are just globbed.
FILE(GLOB FISH_HEADERS src/*.h)
# git_version_gen.sh creates FISH-BUILD-VERSION-FILE if it does not exist, and updates it
# only if it is out-of-date.
execute_process(
COMMAND "${CMAKE_CURRENT_SOURCE_DIR}/build_tools/cmake_git_version_gen.sh"
OUTPUT_VARIABLE FISH_BUILD_VERSION)
message(STATUS "FISH_BUILD_VERSION: ${FISH_BUILD_VERSION}")
# Set up fish-build-version.h
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/src/fish_build_version.h.in"
"${CMAKE_CURRENT_BINARY_DIR}/include/fish_build_version.h")
include_directories(${CMAKE_CURRENT_BINARY_DIR}/include)
# Set up config.h
INCLUDE(cmake/ConfigureChecks.cmake)
2017-11-16 21:33:35 +08:00
INCLUDE(cmake/gettext.cmake)
CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config_cmake.h.in
${CMAKE_CURRENT_BINARY_DIR}/config.h)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR})
# Set up standard directories.
INCLUDE(GNUInstallDirs)
ADD_DEFINITIONS(-DCMAKE
-D_UNICODE=1
-DLOCALEDIR="${CMAKE_INSTALL_FULL_LOCALEDIR}"
-DPREFIX=L"${CMAKE_INSTALL_PREFIX}"
-DDATADIR=L"${CMAKE_INSTALL_FULL_DATADIR}"
-DSYSCONFDIR=L"${CMAKE_INSTALL_FULL_SYSCONFDIR}"
-DBINDIR=L"${CMAKE_INSTALL_FULL_BINDIR}"
-DDOCDIR=L"${CMAKE_INSTALL_FULL_DOCDIR}")
# Set up PCRE2
INCLUDE(cmake/PCRE2.cmake)
# Set up muparser.
INCLUDE(muparser-2.2.5/CMakeLists.txt)
# Set up the docs.
INCLUDE(cmake/Docs.cmake)
# Define a function to link dependencies.
FUNCTION(FISH_LINK_DEPS target)
TARGET_LINK_LIBRARIES(${target} fishlib)
ENDFUNCTION(FISH_LINK_DEPS)
# Define libfish.a.
ADD_LIBRARY(fishlib STATIC ${FISH_SRCS})
TARGET_SOURCES(fishlib PRIVATE ${FISH_HEADERS})
TARGET_LINK_LIBRARIES(fishlib
${CURSES_LIBRARY} ${CURSES_EXTRA_LIBRARY} Threads::Threads ${CMAKE_DL_LIBS}
${PCRE2_LIB} muparser)
# Define fish.
ADD_EXECUTABLE(fish src/fish.cpp)
FISH_LINK_DEPS(fish)
# Define fish_indent.
ADD_EXECUTABLE(fish_indent
src/fish_indent.cpp src/print_help.cpp)
FISH_LINK_DEPS(fish_indent)
# Define fish_key_reader.
ADD_EXECUTABLE(fish_key_reader
src/fish_key_reader.cpp src/print_help.cpp)
FISH_LINK_DEPS(fish_key_reader)
# Set up tests.
INCLUDE(cmake/Tests.cmake)
# Set up install.
INCLUDE(cmake/Install.cmake)
2017-11-13 22:21:54 +08:00
INCLUDE(FeatureSummary)
FEATURE_SUMMARY(WHAT ALL)