From 9f8ae95b0e201b13a6cdd84b2c1436999377cd81 Mon Sep 17 00:00:00 2001
From: ridiculousfish <corydoras@ridiculousfish.com>
Date: Thu, 31 Aug 2017 13:24:20 -0700
Subject: [PATCH] Initial CMake import

This adds a basic CMakeLists.txt. It also adds a ConfigureChecks.cmake
and config_cmake.h.in that produces a config.h.
---
 CMakeFiles/ConfigureChecks.cmake |  92 ++++++++++++
 CMakeLists.txt                   |  75 ++++++++++
 config_cmake.h.in                | 238 +++++++++++++++++++++++++++++++
 3 files changed, 405 insertions(+)
 create mode 100644 CMakeFiles/ConfigureChecks.cmake
 create mode 100644 CMakeLists.txt
 create mode 100644 config_cmake.h.in

diff --git a/CMakeFiles/ConfigureChecks.cmake b/CMakeFiles/ConfigureChecks.cmake
new file mode 100644
index 000000000..86cbf0aca
--- /dev/null
+++ b/CMakeFiles/ConfigureChecks.cmake
@@ -0,0 +1,92 @@
+# Detect curses.
+INCLUDE(FindCurses)
+
+# Get threads.
+set(THREADS_PREFER_PTHREAD_FLAG ON)
+FIND_PACKAGE(Threads REQUIRED)
+
+IF(APPLE)
+  # 10.7+ only.
+  SET(CMAKE_REQUIRED_FLAGS ${CMAKE_REQUIRED_FLAGS} "-Werror=unguarded-availability")
+ENDIF()
+
+# Set up the config.h file.
+SET(PACKAGE_NAME "fish")
+SET(PACKAGE_TARNAME "fish")
+INCLUDE(CheckFunctionExists)
+INCLUDE(CheckSymbolExists)
+INCLUDE(CheckIncludeFiles)
+INCLUDE(CheckStructHasMember)
+INCLUDE(CheckCXXSourceCompiles)
+INCLUDE(CheckTypeSize)
+CHECK_FUNCTION_EXISTS(backtrace_symbols HAVE_BACKTRACE_SYMBOLS)
+CHECK_FUNCTION_EXISTS(clock_gettime HAVE_CLOCK_GETTIME)
+CHECK_FUNCTION_EXISTS(ctermid_r HAVE_CTERMID_R)
+CHECK_INCLUDE_FILES(curses.h HAVE_CURSES_H)
+CHECK_STRUCT_HAS_MEMBER(dirent d_type dirent.h HAVE_STRUCT_DIRENT_D_TYPE)
+CHECK_FUNCTION_EXISTS(dirfd HAVE_DIRFD)
+CHECK_INCLUDE_FILES(execinfo.h HAVE_EXECINFO_H)
+CHECK_FUNCTION_EXISTS(flock HAVE_FLOCK)
+# futimens is new in OS X 10.13 but is a weak symbol.
+# Don't assume it exists just because we can link - it may be null.
+CHECK_SYMBOL_EXISTS(futimens sys/stat.h HAVE_FUTIMENS)
+CHECK_FUNCTION_EXISTS(futimes HAVE_FUTIMES)
+CHECK_FUNCTION_EXISTS(getifaddrs HAVE_GETIFADDRS)
+CHECK_INCLUDE_FILES(getopt.h HAVE_GETOPT_H)
+CHECK_FUNCTION_EXISTS(getpwent HAVE_GETPWENT)
+CHECK_FUNCTION_EXISTS(gettext HAVE_GETTEXT)
+CHECK_INCLUDE_FILES(inttypes.h HAVE_INTTYPES_H)
+CHECK_FUNCTION_EXISTS(killpg HAVE_KILLPG)
+CHECK_INCLUDE_FILES(libintl.h HAVE_LIBINTL_H)
+CHECK_FUNCTION_EXISTS(lrand48_r HAVE_LRAND48_R)
+CHECK_INCLUDE_FILES(memory.h HAVE_MEMORY_H)
+CHECK_FUNCTION_EXISTS(mkostemp HAVE_MKOSTEMP)
+SET(HAVE_CURSES_H ${CURSES_HAVE_CURSES_H})
+SET(HAVE_NCURSES_CURSES_H ${CURSES_HAVE_NCURSES_CURSES_H})
+SET(HAVE_CURSES_H ${CURSES_HAVE_CURSES_H})
+SET(HAVE_NCURSES_H ${CURSES_HAVE_NCURSES_H})
+CHECK_INCLUDE_FILES("ncurses/term.h" HAVE_NCURSES_TERM_H)
+CHECK_FUNCTION_EXISTS(DIR HAVE_NDIR_H)
+CHECK_FUNCTION_EXISTS(shm_open HAVE_SHM_OPEN)
+CHECK_INCLUDE_FILES(siginfo.h HAVE_SIGINFO_H)
+CHECK_INCLUDE_FILES(spawn.h HAVE_SPAWN_H)
+CHECK_INCLUDE_FILES(stdint.h HAVE_STDINT_H)
+CHECK_INCLUDE_FILES(stdlib.h HAVE_STDLIB_H)
+CHECK_FUNCTION_EXISTS(std::wcscasecmp HAVE_STD__WCSCASECMP)
+CHECK_FUNCTION_EXISTS(std::wcsdup HAVE_STD__WCSDUP)
+CHECK_FUNCTION_EXISTS(std::wcsncasecmp HAVE_STD__WCSNCASECMP)
+CHECK_INCLUDE_FILES(strings.h HAVE_STRINGS_H)
+CHECK_INCLUDE_FILES(string.h HAVE_STRING_H)
+CHECK_INCLUDE_FILES(stropts.h HAVE_STROPTS_H)
+CHECK_FUNCTION_EXISTS(struct dirent HAVE_STRUCT_DIRENT_D_TYPE)
+CHECK_FUNCTION_EXISTS(struct stat HAVE_STRUCT_STAT_ST_CTIME_NSEC)
+CHECK_FUNCTION_EXISTS(struct stat HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC)
+CHECK_FUNCTION_EXISTS(struct stat HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC)
+CHECK_SYMBOL_EXISTS(sys_errlist stdio.h HAVE_SYS_ERRLIST)
+CHECK_INCLUDE_FILES(sys/ioctl.h HAVE_SYS_IOCTL_H)
+CHECK_INCLUDE_FILES(sys/resource.h HAVE_SYS_RESOURCE_H)
+CHECK_INCLUDE_FILES(sys/select.h HAVE_SYS_SELECT_H)
+CHECK_INCLUDE_FILES(sys/stat.h HAVE_SYS_STAT_H)
+CHECK_INCLUDE_FILES(sys/sysctl.h HAVE_SYS_SYSCTL_H)
+CHECK_INCLUDE_FILES(sys/types.h HAVE_SYS_TYPES_H)
+CHECK_INCLUDE_FILES(termios.h HAVE_TERMIOS_H)
+CHECK_INCLUDE_FILES(term.h HAVE_TERM_H)
+CHECK_INCLUDE_FILES(unistd.h HAVE_UNISTD_H)
+CHECK_FUNCTION_EXISTS(wcscasecmp HAVE_WCSCASECMP)
+CHECK_FUNCTION_EXISTS(wcsdup HAVE_WCSDUP)
+CHECK_FUNCTION_EXISTS(wcslcpy HAVE_WCSLCPY)
+CHECK_FUNCTION_EXISTS(wcsncasecmp HAVE_WCSNCASECMP)
+CHECK_FUNCTION_EXISTS(wcsndup HAVE_WCSNDUP)
+CHECK_SYMBOL_EXISTS(_nl_msg_cat_cntr stdlib.h HAVE__NL_MSG_CAT_CNTR)
+CHECK_SYMBOL_EXISTS(_sys_errs stdlib.h HAVE__SYS__ERRS)
+
+SET(CMAKE_EXTRA_INCLUDE_FILES termios.h sys/ioctl.h)
+CHECK_TYPE_SIZE("struct winsize" STRUCT_WINSIZE)
+CHECK_SYMBOL_EXISTS("TIOCGWINSZ" "termios.h sys/ioctl.h" HAVE_TIOCGWINSZ)
+IF(${STRUCT_WINSIZE} AND (DEFINED HAVE_TIOCGWINSZ))
+  SET(HAVE_WINSIZE 1)
+ENDIF()
+SET(CMAKE_EXTRA_INCLUDE_FILES)
+
+SET(HAVE__PROC_SELF_STAT (EXISTS "/proc/self/stat"))
+CHECK_TYPE_SIZE("wchar_t[8]" WCHAR_T_BITS)
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 000000000..96e176b17
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,75 @@
+PROJECT(fish-shell)
+CMAKE_MINIMUM_REQUIRED(VERSION 3.1)
+
+# We are C++11.
+SET(CMAKE_CXX_STANDARD 11)
+
+# 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/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
+)
+
+# Set up FISH-BUILD-VERSION-FILE
+# Note this happens when CMake runs, not when the generated build system runs
+EXECUTE_PROCESS(COMMAND build_tools/git_version_gen.sh
+                WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
+                OUTPUT_QUIET)
+
+# Set up config.h
+INCLUDE(CMakeFiles/ConfigureChecks.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(-D_UNICODE=1
+                -DFISH_BUILD_VERSION="${FISH_BUILD_VERSION}"
+                -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 dependency paths.
+INCLUDE_DIRECTORIES(muparser-2.2.5/include/ pcre2-10.22/src/)
+LINK_DIRECTORIES(muparser-2.2.5/lib/ pcre2-10.22/.libs/)
+
+# PCRE2 needs a define.
+SET(PCRE2_WIDTH ${WCHAR_T_BITS})
+
+# Define a function to link dependencies.
+FUNCTION(FISH_LINK_DEPS target)
+  TARGET_LINK_LIBRARIES(${target} ${CURSES_LIBRARIES} Threads::Threads)
+  TARGET_LINK_LIBRARIES(${target} pcre2-${PCRE2_WIDTH} muparser)
+ENDFUNCTION(FISH_LINK_DEPS)
+
+# Define fish.
+ADD_EXECUTABLE(fish src/fish.cpp ${FISH_SRCS})
+TARGET_LINK_LIBRARIES(fish ${CURSES_LIBRARIES})
+
+# Link PCRE and muparser.
+SET(PCRE2_WIDTH ${WCHAR_T_BITS})
+TARGET_LINK_LIBRARIES(fish pcre2-${PCRE2_WIDTH} muparser)
diff --git a/config_cmake.h.in b/config_cmake.h.in
new file mode 100644
index 000000000..d6f575ecf
--- /dev/null
+++ b/config_cmake.h.in
@@ -0,0 +1,238 @@
+/* Define to 1 if you have the `backtrace_symbols' function. */
+#cmakedefine HAVE_BACKTRACE_SYMBOLS 1
+
+/* Define to 1 if you have the `clock_gettime' function. */
+#cmakedefine HAVE_CLOCK_GETTIME 1
+
+/* Define to 1 if you have the `ctermid_r' function. */
+#cmakedefine HAVE_CTERMID_R 1
+
+/* Define to 1 if you have the <curses.h> header file. */
+#cmakedefine HAVE_CURSES_H 1
+
+/* Define to 1 if you have the <dirent.h> header file, and it defines `DIR'. */
+#cmakedefine HAVE_DIRENT_H 1
+
+/* Define to 1 if you have the `dirfd' function. */
+#cmakedefine HAVE_DIRFD 1
+
+/* Define to 1 if you have the <execinfo.h> header file. */
+#cmakedefine HAVE_EXECINFO_H 1
+
+/* Define to 1 if you have the `flock' function. */
+#cmakedefine HAVE_FLOCK 1
+
+/* Define to 1 if you have the `futimens' function. */
+#cmakedefine HAVE_FUTIMENS 1
+
+/* Define to 1 if you have the `futimes' function. */
+#cmakedefine HAVE_FUTIMES 1
+
+/* Define to 1 if you have the `getifaddrs' function. */
+#cmakedefine HAVE_GETIFADDRS 1
+
+/* Define to 1 if you have the <getopt.h> header file. */
+#cmakedefine HAVE_GETOPT_H 1
+
+/* Define to 1 if you have the `getpwent' function. */
+#cmakedefine HAVE_GETPWENT 1
+
+/* Define to 1 if you have the `gettext' function. */
+#cmakedefine HAVE_GETTEXT 1
+
+/* Define to 1 if you have the <inttypes.h> header file. */
+#cmakedefine HAVE_INTTYPES_H 1
+
+/* Define to 1 if you have the `killpg' function. */
+#cmakedefine HAVE_KILLPG 1
+
+/* Define to 1 if you have the <libintl.h> header file. */
+#cmakedefine HAVE_LIBINTL_H 1
+
+/* Define to 1 if you have the `lrand48_r' function. */
+#cmakedefine HAVE_LRAND48_R 1
+
+/* Define to 1 if you have the <memory.h> header file. */
+#cmakedefine HAVE_MEMORY_H 1
+
+/* Define to 1 if you have the `mkostemp' function. */
+#cmakedefine HAVE_MKOSTEMP 1
+
+/* Define to 1 if you have the <ncurses/curses.h> header file. */
+#cmakedefine HAVE_NCURSES_CURSES_H 1
+
+/* Define to 1 if you have the <ncurses.h> header file. */
+#cmakedefine HAVE_NCURSES_H 1
+
+/* Define to 1 if you have the <ncurses/term.h> header file. */
+#cmakedefine HAVE_NCURSES_TERM_H 1
+
+/* Define to 1 if you have the <ndir.h> header file, and it defines `DIR'. */
+#cmakedefine HAVE_NDIR_H 1
+
+/* Define to 1 if the shm_open() function exists */
+#cmakedefine HAVE_SHM_OPEN 1
+
+/* Define to 1 if you have the <siginfo.h> header file. */
+#cmakedefine HAVE_SIGINFO_H 1
+
+/* Define to 1 if you have the <spawn.h> header file. */
+#cmakedefine HAVE_SPAWN_H 1
+
+/* Define to 1 if you have the <stdint.h> header file. */
+#cmakedefine HAVE_STDINT_H 1
+
+/* Define to 1 if you have the <stdlib.h> header file. */
+#cmakedefine HAVE_STDLIB_H 1
+
+/* Define to 1 if you have the `std::wcscasecmp' function. */
+#cmakedefine HAVE_STD__WCSCASECMP 1
+
+/* Define to 1 if you have the `std::wcsdup' function. */
+#cmakedefine HAVE_STD__WCSDUP 1
+
+/* Define to 1 if you have the `std::wcsncasecmp' function. */
+#cmakedefine HAVE_STD__WCSNCASECMP 1
+
+/* Define to 1 if you have the <strings.h> header file. */
+#cmakedefine HAVE_STRINGS_H 1
+
+/* Define to 1 if you have the <string.h> header file. */
+#cmakedefine HAVE_STRING_H 1
+
+/* Define to 1 if you have the <stropts.h> header file. */
+#cmakedefine HAVE_STROPTS_H 1
+
+/* Define to 1 if `d_type' is a member of `struct dirent'. */
+#cmakedefine HAVE_STRUCT_DIRENT_D_TYPE 1
+
+/* Define to 1 if `st_ctime_nsec' is a member of `struct stat'. */
+#cmakedefine HAVE_STRUCT_STAT_ST_CTIME_NSEC 1
+
+/* Define to 1 if `st_mtimespec.tv_nsec' is a member of `struct stat'. */
+#cmakedefine HAVE_STRUCT_STAT_ST_MTIMESPEC_TV_NSEC 1
+
+/* Define to 1 if `st_mtim.tv_nsec' is a member of `struct stat'. */
+#cmakedefine HAVE_STRUCT_STAT_ST_MTIM_TV_NSEC 1
+
+/* Define to 1 if you have the <sys/dir.h> header file, and it defines `DIR'.
+   */
+#cmakedefine HAVE_SYS_DIR_H 1
+
+/* Define to 1 if the sys_errlist array is available. */
+#cmakedefine HAVE_SYS_ERRLIST 1
+
+/* Define to 1 if you have the <sys/ioctl.h> header file. */
+#cmakedefine HAVE_SYS_IOCTL_H 1
+
+/* Define to 1 if you have the <sys/ndir.h> header file, and it defines `DIR'.
+   */
+#cmakedefine HAVE_SYS_NDIR_H 1
+
+/* Define to 1 if you have the <sys/resource.h> header file. */
+#cmakedefine HAVE_SYS_RESOURCE_H 1
+
+/* Define to 1 if you have the <sys/select.h> header file. */
+#cmakedefine HAVE_SYS_SELECT_H 1
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#cmakedefine HAVE_SYS_STAT_H 1
+
+/* Define to 1 if you have the <sys/sysctl.h> header file. */
+#cmakedefine HAVE_SYS_SYSCTL_H 1
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#cmakedefine HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the <termios.h> header file. */
+#cmakedefine HAVE_TERMIOS_H 1
+
+/* Define to 1 if you have the <term.h> header file. */
+#cmakedefine HAVE_TERM_H 1
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#cmakedefine HAVE_UNISTD_H 1
+
+/* Define to 1 if you have the `wcscasecmp' function. */
+#cmakedefine HAVE_WCSCASECMP 1
+
+/* Define to 1 if you have the `wcsdup' function. */
+#cmakedefine HAVE_WCSDUP 1
+
+/* Define to 1 if you have the `wcslcpy' function. */
+#cmakedefine HAVE_WCSLCPY 1
+
+/* Define to 1 if you have the `wcsncasecmp' function. */
+#cmakedefine HAVE_WCSNCASECMP 1
+
+/* Define to 1 if you have the `wcsndup' function. */
+#cmakedefine HAVE_WCSNDUP 1
+
+/* Define to 1 if the winsize struct and TIOCGWINSZ macro exist */
+#cmakedefine HAVE_WINSIZE 1
+
+/* Define to 1 if the _nl_msg_cat_cntr symbol is exported. */
+#cmakedefine HAVE__NL_MSG_CAT_CNTR 1
+
+/* Define to 1 if you have the file `/proc/self/stat'. */
+#cmakedefine HAVE__PROC_SELF_STAT 1
+
+/* Define to 1 if the _sys_errs array is available. */
+#cmakedefine HAVE__SYS__ERRS 1
+
+/* Define to 1 to disable ncurses macros that conflict with the STL */
+#define NCURSES_NOMACROS 1
+
+/* Define to 1 to disable curses macros that conflict with the STL */
+#define NOMACROS 1
+
+/* Define to the address where bug reports for this package should be sent. */
+#define PACKAGE_BUGREPORT "fish-users@lists.sourceforge.net"
+
+/* Define to the full name of this package. */
+#define PACKAGE_NAME "fish"
+
+/* Define to the full name and version of this package. */
+// #define PACKAGE_STRING "FIXME" # FISH-BUILD-VERSION-FILE
+
+/* Define to the one symbol short name of this package. */
+#cmakedefine PACKAGE_TARNAME "fish" 1
+
+/* Define to the version of this package. */
+// #define PACKAGE_VERSION "FIXME"
+
+/* Define to 1 if tparm accepts a fixed amount of paramters. */
+// #cmakedefine TPARM_SOLARIS_KLUDGE 1
+
+/* Perform string translations with gettext */
+// #cmakedefine USE_GETTEXT 1
+
+/* The size of wchar_t in bits. */
+#define WCHAR_T_BITS ${WCHAR_T_BITS}
+
+/* Enable large inode numbers on Mac OS X 10.5.  */
+#ifndef _DARWIN_USE_64_BIT_INODE
+# define _DARWIN_USE_64_BIT_INODE 1
+#endif
+
+/* Number of bits in a file offset, on hosts where this is settable. */
+// TODO #cmakedefine _FILE_OFFSET_BITS 1
+
+/* Define for large files, on AIX-style hosts. */
+// TODO #cmakedefine _LARGE_FILES 1
+
+#if __GNUC__ >= 3
+#ifndef __warn_unused
+#define __warn_unused __attribute__ ((warn_unused_result))
+#endif
+#ifndef __sentinel
+#define __sentinel __attribute__ ((sentinel))
+#endif
+#ifndef __packed
+#define __packed __attribute__ ((packed))
+#endif
+#else
+#define __warn_unused
+#define __sentinel
+#define __packed
+#endif