diff options
-rw-r--r-- | CMakeLists.txt | 104 | ||||
-rw-r--r-- | README_d/ChangeLog | 4 | ||||
-rw-r--r-- | README_d/README.cmake | 1 | ||||
-rw-r--r-- | cmake/README.txt | 68 | ||||
-rw-r--r-- | cmake/Toolchain_clang.cmake | 19 | ||||
-rw-r--r-- | cmake/Toolchain_generic.cmake | 21 | ||||
-rw-r--r-- | cmake/Toolchain_mingw32.cmake | 23 | ||||
-rw-r--r-- | cmake/auk.ico | bin | 0 -> 5190 bytes | |||
-rwxr-xr-x | cmake/basictest | 14 | ||||
-rw-r--r-- | cmake/configure.cmake | 286 | ||||
-rw-r--r-- | cmake/package.cmake | 54 | ||||
-rw-r--r-- | doc/CMakeLists.txt | 82 | ||||
-rw-r--r-- | extension/CMakeLists.txt | 87 | ||||
-rw-r--r-- | po/CMakeLists.txt | 133 | ||||
-rw-r--r-- | test/CMakeLists.txt | 51 |
15 files changed, 947 insertions, 0 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 00000000..ba604c78 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,104 @@ +# +# CMakeLists.txt --- CMake input file for gawk +# +# Copyright (C) 2013 +# the Free Software Foundation, Inc. +# +# This file is part of GAWK, the GNU implementation of the +# AWK Programming Language. +# +# GAWK is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# GAWK is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +# + +## process this file with CMake to produce Makefile + +cmake_minimum_required (VERSION 2.6) +project (gawk C) + +include(cmake/configure.cmake) + +set (EXTRA_LIBS "") + +if (${HAVE_MPFR}) + set (EXTRA_LIBS ${EXTRA_LIBS} mpfr gmp) +endif () +if (${DYNAMIC}) + set (EXTRA_LIBS ${EXTRA_LIBS} ${CMAKE_DL_LIBS} ) +endif () + +include_directories(${CMAKE_SOURCE_DIR}) + +if(WIN32 OR "${CMAKE_SYSTEM_NAME}" STREQUAL "Windows") + # This is enough to build with MinGW cross-compiler on OpenSuSE 12.2. + # On Ubuntu 12.04 patches to gawk's source code are needed: + # - insert #include <windows.h> at the top of awk.h + # - remove function execvp from pc/gawkmisc.pc + DefineConfigHValue(HAVE_WCTYPE_T 1) + DefineConfigHValue(WEOF EOF) + DefineConfigHValue(HAVE_USLEEP 1) + DefineConfigHValue(HAVE_WINT_T 1) + DefineConfigHValue(HAVE_ISWUPPER 1) + DefineConfigHValue(HAVE_SETENV 1) + DefineConfigHValue(STDC_HEADERS 1) + set (GAWK_SOURCES ${GAWK_SOURCES} regex.c pc/getid.c pc/gawkmisc.pc) +endif() + +set (GAWK_SOURCES ${GAWK_SOURCES} + array.c + builtin.c + cint_array.c + command.c + debug.c + dfa.c + eval.c + ext.c + field.c + floatcomp.c + gawkapi.c + gawkmisc.c + int_array.c + io.c + main.c + mpfr.c + msg.c + node.c + profile.c + random.c + re.c + replace.c + str_array.c + symbol.c + version.c +) + +add_executable (gawk ${GAWK_SOURCES} ${BISON_awkgram_OUTPUTS}) +target_link_libraries (gawk m ${EXTRA_LIBS}) +install(PROGRAMS ${CMAKE_BINARY_DIR}/gawk${CMAKE_EXECUTABLE_SUFFIX} DESTINATION bin) + +if (CMAKE_HOST_UNIX) + # Beware: before building the extension, -DGAWK gets undefined. + add_subdirectory(extension) + + if(NOT ${CMAKE_CROSSCOMPILING} STREQUAL "TRUE") + enable_testing() + add_subdirectory(test) + endif() + + add_subdirectory(doc) + + include(InstallRequiredSystemLibraries) + set(CPACK_PACKAGING_INSTALL_PREFIX /usr) + include(cmake/package.cmake) +endif() diff --git a/README_d/ChangeLog b/README_d/ChangeLog index a9463d4f..2ec0a7a6 100644 --- a/README_d/ChangeLog +++ b/README_d/ChangeLog @@ -1,3 +1,7 @@ +2013-02-06 Juergen Kahrs <jkahrs@users.sourceforge.net> + + * Added README.cmake. + 2012-12-24 Arnold D. Robbins <arnold@skeeve.com> * 4.0.2: Release tar ball made. diff --git a/README_d/README.cmake b/README_d/README.cmake new file mode 100644 index 00000000..b405901e --- /dev/null +++ b/README_d/README.cmake @@ -0,0 +1 @@ +see cmake/README.txt diff --git a/cmake/README.txt b/cmake/README.txt new file mode 100644 index 00000000..f4feaf7f --- /dev/null +++ b/cmake/README.txt @@ -0,0 +1,68 @@ +CMake is a build automation system + http://en.wikipedia.org/wiki/Cmake + +We try to use it as a replacement for the established GNU build system. +This attempt is currently only experimental. If you wonder why anyone +should do this, read + + Why the KDE project switched to CMake -- and how + http://lwn.net/Articles/188693/ + Escape from GNU Autohell! + http://www.shlomifish.org/open-source/anti/autohell + +- How can I get GNU Awk compiled with CMake as fast as possible ? + git clone git://git.savannah.gnu.org/gawk.git + cd gawk + git checkout cmake + mkdir build + cd build + cmake .. + make + ./gawk --version + make test +Notice that this git-checkout allows you to read the source code, +track the cmake branch and get updates. You will not be able to +commit anything. + +- How can I use git to contribute source code ? +You need an account at Savannah. Read this to understand the first steps: + http://savannah.gnu.org/maintenance/UsingGit + README.git +Use your account there to register your public ssh key at Savannah. +Then you are ready to checkout. Remember that (when cloning) you are +setting up your own local repository and make sure you configure it +properly. + git clone ssh://my_account_name@git.sv.gnu.org/srv/git/gawk.git + git config --global user.name "first-name last-name" + git config --global user.email First.Last@email.com + git config --global color.ui auto + +- What is the current status of the cmake branch ? +It has just begun, pre-alpha, unclear if it will ever be taken up +by the maintainer. We want to study if using CMake with such a +basic tool like gawk is feasible and if it easier to use than +the GNU build system. + +- Where can I find a tutorial on CMake basics ? +Use the "official tutorial": + http://www.cmake.org/cmake/help/cmake_tutorial.html + +- Where is the reference of all commands and variables ? +Depending on the CMake version you use, select one of these: + http://www.cmake.org/cmake/help/v2.8.10/cmake.html + +- How can I cross-compile ? +Proceed in the same way as explained above for native compilation, +but use a different build directory. When using CMake, do this: + cmake -DCMAKE_TOOLCHAIN_FILE=../cmake/Toolchain_mingw32.cmake .. +Write a new Toolchain file for your cross-compiler and use it. + +- How can I build an installable file ? +Use "make package". The exact kind of installable file depends on your +operating system and defaults to TGZ. + +- Can I build an executable that runs on any Win32 platform ? +It is possible to build for the target Win32, but only with cross-compilers +on certain platforms. You need a MinGW cross-compiler and the NSIS package +builder. + diff --git a/cmake/Toolchain_clang.cmake b/cmake/Toolchain_clang.cmake new file mode 100644 index 00000000..89353570 --- /dev/null +++ b/cmake/Toolchain_clang.cmake @@ -0,0 +1,19 @@ +# http://www.cmake.org/Wiki/CmakeMingw +# http://www.cmake.org/Wiki/CMake_Cross_Compiling#The_toolchain_file + +# the name of the target operating system +SET(CMAKE_SYSTEM_NAME Generic) + +# which compilers to use for C and C++ +SET(CMAKE_C_COMPILER /usr/bin/clang) + +# here is the target environment located +SET(CMAKE_FIND_ROOT_PATH /usr/lib64/clang/3.1) + +# adjust the default behaviour of the FIND_XXX() commands: +# search headers and libraries in the target environment, search +# programs in the host environment +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + diff --git a/cmake/Toolchain_generic.cmake b/cmake/Toolchain_generic.cmake new file mode 100644 index 00000000..91ddc6e7 --- /dev/null +++ b/cmake/Toolchain_generic.cmake @@ -0,0 +1,21 @@ +# http://www.cmake.org/Wiki/CmakeMingw +# http://www.cmake.org/Wiki/CMake_Cross_Compiling#The_toolchain_file + +# the name of the target operating system +SET(CMAKE_SYSTEM_NAME Generic) + +# which compilers to use for C and C++ +# Settings for Ubuntu 12.04.1 LTS +SET(CMAKE_C_COMPILER /usr/bin/gcc) + +# here is the target environment located +# Settings for Ubuntu 12.04.1 LTS +SET(CMAKE_FIND_ROOT_PATH /usr/) + +# adjust the default behaviour of the FIND_XXX() commands: +# search headers and libraries in the target environment, search +# programs in the host environment +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + diff --git a/cmake/Toolchain_mingw32.cmake b/cmake/Toolchain_mingw32.cmake new file mode 100644 index 00000000..bb885f2f --- /dev/null +++ b/cmake/Toolchain_mingw32.cmake @@ -0,0 +1,23 @@ +# http://www.cmake.org/Wiki/CmakeMingw +# http://www.cmake.org/Wiki/CMake_Cross_Compiling#The_toolchain_file + +# the name of the target operating system +SET(CMAKE_SYSTEM_NAME Windows) + +# which compilers to use for C and C++ +# Settings for Ubuntu 12.04.1 LTS +SET(CMAKE_C_COMPILER /usr/bin/i686-w64-mingw32-gcc) +SET(CMAKE_CXX_COMPILER /usr/bin/i686-w64-mingw32-g++) +SET(CMAKE_RC_COMPILER /usr/bin/i686-w64-mingw32-windres) + +# here is the target environment located +# Settings for Ubuntu 12.04.1 LTS +SET(CMAKE_FIND_ROOT_PATH /usr/i686-w64-mingw32) + +# adjust the default behaviour of the FIND_XXX() commands: +# search headers and libraries in the target environment, search +# programs in the host environment +set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) +set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY) +set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY) + diff --git a/cmake/auk.ico b/cmake/auk.ico Binary files differnew file mode 100644 index 00000000..795ef1d9 --- /dev/null +++ b/cmake/auk.ico diff --git a/cmake/basictest b/cmake/basictest new file mode 100755 index 00000000..42cb2864 --- /dev/null +++ b/cmake/basictest @@ -0,0 +1,14 @@ +#!/bin/sh + +TESTHOME=$(dirname ${0})/../test +export AWKPATH=${TESTHOME} +export AWKLIBPATH=${TESTHOME}/../build/extension/ +export LANG=C +if test -r ${TESTHOME}/${2}.in +then + $1 $3 -f ${2}.awk < ${TESTHOME}/${2}.in > ${TESTHOME}/_${2} 2>&1 || echo EXIT CODE: $? >> ${TESTHOME}/_${2} +else + $1 $3 -f ${2}.awk > ${TESTHOME}/_${2} 2>&1 || echo EXIT CODE: $? >> ${TESTHOME}/_${2} +fi +cmp ${TESTHOME}/${2}.ok ${TESTHOME}/_${2} && rm -f ${TESTHOME}/_${2} + diff --git a/cmake/configure.cmake b/cmake/configure.cmake new file mode 100644 index 00000000..cd66e24b --- /dev/null +++ b/cmake/configure.cmake @@ -0,0 +1,286 @@ +# +# cmake/configure --- CMake input file for gawk +# +# Copyright (C) 2013 +# the Free Software Foundation, Inc. +# +# This file is part of GAWK, the GNU implementation of the +# AWK Programming Language. +# +# GAWK is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# GAWK is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +# + +## process this file with CMake to produce Makefile + +option (USE_CONFIG_H "Generate a file config.h for inclusion into C source code" ON) +if (USE_CONFIG_H) + file( WRITE config.h "/* all settings defined by CMake. */\n\n" ) + ADD_DEFINITIONS (-D HAVE_CONFIG_H) + # Configure a header file to pass some of the CMake settings + # to the source code + # http://www.cmake.org/cmake/help/v2.8.8/cmake.html#command:configure_file + # CONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/config.cmake.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h IMMEDIATE ) +else() + file( WRITE config.h "/* empty file, all settings defined by CMake. */" ) +endif() + +include(CheckIncludeFiles) +include(CheckIncludeFile) +include(CheckSymbolExists) +include(CheckFunctionExists) +include(CheckLibraryExists) +include(CheckTypeSize) +include(CheckStructHasMember) + +MACRO(DefineConfigH feature) +# message(STATUS feature=${feature}=${${feature}}) + if (${feature}) + if (${USE_CONFIG_H} STREQUAL ON) + FILE( APPEND config.h "#define ${feature} ${${feature}}\n") + else() + #ADD_DEFINITIONS (-D ${feature}) + ADD_DEFINITIONS (-D${feature}=${${feature}}) + endif () + endif () +ENDMACRO(DefineConfigH) + +MACRO(DefineConfigHValue feature value) + set(${feature} ${value}) + DefineConfigH(${feature}) +ENDMACRO(DefineConfigHValue) + +MACRO(DefineFunctionIfAvailable func feature) + check_function_exists("${func}" "${feature}") + DefineConfigH(${feature}) +ENDMACRO(DefineFunctionIfAvailable) + +MACRO(DefineHFileIfAvailable hfile feature) + check_include_file("${hfile}" "${feature}") + DefineConfigH(${feature}) +ENDMACRO(DefineHFileIfAvailable) + +MACRO(DefineTypeIfAvailable type feature) + check_type_size("${type}" "${feature}") + DefineConfigH(${feature}) +ENDMACRO(DefineTypeIfAvailable) + +MACRO(DefineSymbolIfAvailable symbol hfile feature) + check_symbol_exists("${symbol}" "${hfile}" "${feature}") + DefineConfigH(${feature}) +ENDMACRO(DefineSymbolIfAvailable) + +MACRO(DefineStructHasMemberIfAvailable struct member hfile feature) + check_struct_has_member("${struct}" "${member}" "${hfile}" "${feature}") + DefineConfigH(${feature}) +ENDMACRO(DefineStructHasMemberIfAvailable) + +MACRO(DefineLibraryIfAvailable lib func location feature) + check_library_exists("${lib}" "${func}" "${location}" "${feature}") + DefineConfigH(${feature}) +ENDMACRO(DefineLibraryIfAvailable) + +FILE( READ configure.ac CONFIG_AUTOMAKE ) +STRING( REGEX MATCH "AC_INIT\\(\\[GNU Awk\\], ([0-9]+\\.[0-9]+\\.[0-9]+)" GAWK_AUTOMAKE_LINE_VERSION "${CONFIG_AUTOMAKE}") +STRING( REGEX REPLACE ".*([0-9]+)\\.[0-9]+\\.[0-9]+.*" "\\1" GAWK_MAJOR_VERSION "${GAWK_AUTOMAKE_LINE_VERSION}") +STRING( REGEX REPLACE ".*[0-9]+\\.([0-9]+)\\.[0-9]+.*" "\\1" GAWK_MINOR_VERSION "${GAWK_AUTOMAKE_LINE_VERSION}") +STRING( REGEX REPLACE ".*[0-9]+\\.[0-9]+\\.([0-9]+).*" "\\1" GAWK_BUGFIX_VERSION "${GAWK_AUTOMAKE_LINE_VERSION}") + +# The definition for GAWK cannot be passed in config.he because +# the extensions will fail to build. +add_definitions(-DGAWK) +DefineConfigHValue(GAWK_VERSION "${GAWK_MAJOR_VERSION}.${GAWK_MINOR_VERSION}.${GAWK_BUGFIX_VERSION}") +DefineConfigHValue(VERSION \\"${GAWK_VERSION}\\") +DefineConfigHValue(PACKAGE \\"gawk\\") +DefineConfigHValue(PACKAGE_STRING "GNU Awk ${GAWK_VERSION}") +DefineConfigHValue(PACKAGE_TARNAME \\"gawk\\") +DefineConfigHValue(PACKAGE_URL \\"http://www.gnu.org/software/gawk/\\") +DefineConfigHValue(PACKAGE_VERSION \\"${GAWK_VERSION}\\") +DefineConfigHValue(DEFPATH \\"${CMAKE_BINARY_DIR}/awk\\") +DefineConfigHValue(DEFLIBPATH \\"${CMAKE_BINARY_DIR}/lib\\") +if (CMAKE_DL_LIBS) + message(STATUS "Found CMAKE_DL_LIBS:${CMAKE_DL_LIBS}") + DefineConfigHValue(DYNAMIC 1) +else() + message(STATUS "Found no CMAKE_DL_LIBS") +endif() +if (CMAKE_SHARED_LIBRARY_SUFFIX) + STRING( REGEX REPLACE "^(\\.)([a-zA-Z0-9])" "\\2" SHLIBEXT "${CMAKE_SHARED_LIBRARY_SUFFIX}") + DefineConfigHValue(SHLIBEXT \\"${SHLIBEXT}\\") + message(STATUS "Found SHLIBEXT: ${SHLIBEXT}") +else() + message(STATUS "Found no SHLIBEXT") +endif() +DefineTypeIfAvailable("unsigned int" SIZEOF_UNSIGNED_INT) +DefineTypeIfAvailable("unsigned long" SIZEOF_UNSIGNED_LONG) +#/* Define to 1 if *printf supports %F format */ +add_definitions(-D PRINTF_HAS_F_FORMAT) +#/* Define as the return type of signal handlers (`int' or `void'). */ +add_definitions(-D RETSIGTYPE=void) +#add_definitions(-D PIPES_SIMULATED) +add_definitions(-D GETPGRP_VOID) +#add_definitions(-D YYPARSE_PARAM) + +DefineFunctionIfAvailable(snprintf HAVE_SNPRINTF) +DefineFunctionIfAvailable(vprintf HAVE_VPRINTF) +DefineHFileIfAvailable(sys/types.h HAVE_SYS_TYPES_H) +DefineHFileIfAvailable(sys/stat.h HAVE_SYS_STAT_H) +DefineHFileIfAvailable(string.h HAVE_STRING_H) +DefineHFileIfAvailable(memory.h HAVE_MEMORY_H) +DefineHFileIfAvailable(strings.h HAVE_STRINGS_H) +DefineHFileIfAvailable(stdint.h HAVE_STDINT_H) +DefineHFileIfAvailable(inttypes.h HAVE_INTTYPES_H) +DefineHFileIfAvailable(stdlib.h HAVE_STDLIB_H) +DefineHFileIfAvailable(unistd.h HAVE_UNISTD_H) +if (CMAKE_HOST_UNIX) + DefineFunctionIfAvailable(gettext HAVE_GETTEXT) + DefineFunctionIfAvailable(dcgettext HAVE_DCGETTEXT) + FIND_PACKAGE(Gettext REQUIRED) + # FIND_PACKAGE(XGettext REQUIRED) + # FIND_PACKAGE(Iconv REQUIRED) + FIND_PATH(INTL_INCLUDE_DIR libintl.h PATHS /usr/include /usr/local/include) + FIND_LIBRARY(INTL_LIBRARIES intl c PATHS /usr/lib/ /usr/local/lib) +endif() +DefineSymbolIfAvailable("CODESET" "langinfo.h" HAVE_LANGINFO_CODESET) +DefineSymbolIfAvailable("LC_MESSAGES" "locale.h" HAVE_LC_MESSAGES) +DefineTypeIfAvailable("_Bool" HAVE__BOOL) +if (${HAVE_GETTEXT} AND ${HAVE_DCGETTEXT} AND ${HAVE_LANGINFO_CODESET} AND ${HAVE_LC_MESSAGES}) + add_definitions(-D LOCALEDIR=\\"/usr/share/locale\\") + add_definitions(-D ENABLE_NLS) + ADD_SUBDIRECTORY( po ) +endif() +DefineHFileIfAvailable(stdbool.h HAVE_STDBOOL_H) +DefineHFileIfAvailable(sys/wait.h HAVE_SYS_WAIT_H) +DefineHFileIfAvailable(arpa/inet.h HAVE_ARPA_INET_H) +DefineHFileIfAvailable(fcntl.h HAVE_FCNTL_H) +DefineHFileIfAvailable(limits.h HAVE_LIMITS_H) +DefineHFileIfAvailable(locale.h HAVE_LOCALE_H) +DefineHFileIfAvailable(libintl.h HAVE_LIBINTL_H) +DefineHFileIfAvailable(mcheck.h HAVE_MCHECK_H) +DefineHFileIfAvailable(netdb.h HAVE_NETDB_H) +DefineHFileIfAvailable(netinet/in.h HAVE_NETINET_IN_H) +DefineHFileIfAvailable(stdarg.h HAVE_STDARG_H) +DefineHFileIfAvailable(stddef.h HAVE_STDDEF_H) +DefineHFileIfAvailable(sys/ioctl.h HAVE_SYS_IOCTL_H) +DefineHFileIfAvailable(sys/param.h HAVE_SYS_PARAM_H) +DefineHFileIfAvailable(sys/socket.h HAVE_SYS_SOCKET_H) +DefineHFileIfAvailable(sys/termios.h HAVE_TERMIOS_H) +DefineHFileIfAvailable(stropts.h HAVE_STROPTS_H) +DefineHFileIfAvailable(wchar.h HAVE_WCHAR_H) +DefineHFileIfAvailable(wctype.h HAVE_WCTYPE_H) +#DefineTypeIfAvailable("long long int" HAVE_LONG_LONG_INT) +#add_definitions(-D HAVE_UNSIGNED_LONG_LONG_INT) +DefineTypeIfAvailable(intmax_t INTMAX_T) +DefineTypeIfAvailable(uintmax_t UINTMAX_T) + +# Some of these dont work, maybe CheckCSourceCompiles would be better. +DefineTypeIfAvailable("time_t" TIME_T_IN_SYS_TYPES_H) +DefineTypeIfAvailable("wctype_t" WCTYPE_T) +add_definitions(-D WINT_T) +#DefineTypeIfAvailable("wint_t" WINT_T) +add_definitions(-D HAVE_SOCKADDR_STORAGE) +#DefineTypeIfAvailable("struct sockaddr_storage" SOCKADDR_STORAGE) +add_definitions(-D HAVE_STRUCT_STAT_ST_BLKSIZE) +#DefineStructHasMemberIfAvailable("struct stat" st_blksize bits/stat.h HAVE_STRUCT_STAT_ST_BLKSIZE) +add_definitions(-D HAVE_ST_BLKSIZE) +#DefineStructHasMemberIfAvailable("struct stat" st_blksize bits/stat.h HAVE_ST_BLKSIZE) +DefineStructHasMemberIfAvailable("struct tm" tm_zone time.h HAVE_TM_ZONE) +DefineStructHasMemberIfAvailable("struct tm" tm_zone time.h HAVE_STRUCT_TM_TM_ZONE) + +DefineHFileIfAvailable(sys/time.h HAVE_SYS_TIME_H) +DefineFunctionIfAvailable(alarm HAVE_ALARM) +DefineFunctionIfAvailable(mktime HAVE_MKTIME) +DefineFunctionIfAvailable(getaddrinfo HAVE_GETADDRINFO) +DefineFunctionIfAvailable(atexit HAVE_ATEXIT) +DefineFunctionIfAvailable(btowc HAVE_BTOWC) +add_definitions(-D HAVE_FMOD) +#DefineFunctionIfAvailable(fmod HAVE_FMOD) +DefineFunctionIfAvailable(isinf HAVE_ISINF) +DefineFunctionIfAvailable(ismod HAVE_ISMOD) +DefineFunctionIfAvailable(getgrent HAVE_GETGRENT) +DefineFunctionIfAvailable(getgroups HAVE_GETGROUPS) +add_definitions(-D GETGROUPS_T=gid_t) +DefineTypeIfAvailable("pid_t" PID_T) +DefineFunctionIfAvailable(grantpt HAVE_GRANTPT) +DefineFunctionIfAvailable(isascii HAVE_ISASCII) +DefineFunctionIfAvailable(iswctype HAVE_ISWCTYPE) +DefineFunctionIfAvailable(iswlower HAVE_ISWLOWER) +DefineFunctionIfAvailable(iswupper HAVE_ISUPPER) +DefineFunctionIfAvailable(mbrlen HAVE_MBRLEN) +DefineFunctionIfAvailable(memcmp HAVE_MEMCMP) +DefineFunctionIfAvailable(memcpy HAVE_MEMCPY) +DefineFunctionIfAvailable(memmove HAVE_MEMMOVE) +DefineFunctionIfAvailable(memset HAVE_MEMSET) +DefineFunctionIfAvailable(mkstemp HAVE_MKSTEMP) +DefineFunctionIfAvailable(posix_openpt HAVE_POSIX_OPENPT) +DefineFunctionIfAvailable(setenv HAVE_SETENV) +DefineFunctionIfAvailable(setlocale HAVE_SETLOCALE) +DefineFunctionIfAvailable(setsid HAVE_SETSID) +DefineFunctionIfAvailable(strchr HAVE_STRCHR) +DefineFunctionIfAvailable(strerror HAVE_STRERROR) +DefineFunctionIfAvailable(strftime HAVE_STRFTIME) +DefineFunctionIfAvailable(strncasecmp HAVE_STRNCASECMP) +DefineFunctionIfAvailable(strcoll HAVE_STRCOLL) +DefineFunctionIfAvailable(strtod HAVE_STRTOD) +DefineFunctionIfAvailable(strtoul HAVE_STRTOUL) +DefineFunctionIfAvailable(system HAVE_SYSTEM) +DefineFunctionIfAvailable(tmpfile HAVE_TMPFILE) +DefineFunctionIfAvailable(towlower HAVE_TOWLOWER) +DefineFunctionIfAvailable(towupper HAVE_TOWUPPER) +DefineFunctionIfAvailable(tzset HAVE_TZSET) +DefineFunctionIfAvailable(usleep HAVE_USLEEP) +DefineFunctionIfAvailable(wcrtomb HAVE_WCRTOMB) +DefineFunctionIfAvailable(wcscoll HAVE_WCSCOLL) +DefineFunctionIfAvailable(wctype HAVE_WCTYPE) +DefineFunctionIfAvailable(mbrtowc HAVE_MBRTOWC) + +add_definitions(-D HAVE_STRINGIZE) +add_definitions(-D _Noreturn=) + +if (CMAKE_HOST_UNIX) + find_package(BISON REQUIRED) + if (${BISON_FOUND} STREQUAL "TRUE") + BISON_TARGET(awkgram awkgram.y ${CMAKE_SOURCE_DIR}/awkgram.c) + endif() + + #http://www.cmake.org/cmake/help/v2.8.10/cmake.html#module:FindGettext + find_package(Gettext REQUIRED) + if (GETTEXT_FOUND STREQUAL "TRUE") + include_directories(${GETTEXT_INCLUDE_DIR}) + else () + message( FATAL_ERROR "Gettext not found" ) + endif() + + find_package(LATEX) + include(GNUInstallDirs) + include(GetPrerequisites) +endif() + +# For some unknown reason the defines for the extension +# are written into config.h only if they are implemented +# here and not in extension/CMakeLists.txt. +DefineLibraryIfAvailable(m sin "" HAVE_LIBM) +DefineLibraryIfAvailable(mpfr mpfr_add_si "" HAVE_MPFR) +DefineLibraryIfAvailable(c socket "" HAVE_SOCKETS) +DefineFunctionIfAvailable(fnmatch HAVE_FNMATCH) +DefineHFileIfAvailable(fnmatch.h HAVE_FNMATCH_H) +DefineHFileIfAvailable(dirent.h HAVE_DIRENT_H) +DefineFunctionIfAvailable(getdtablesize HAVE_GETDTABLESIZE) +DefineFunctionIfAvailable(select HAVE_SELECT) +DefineFunctionIfAvailable(gettimeofday HAVE_GETTIMEOFDAY) +DefineHFileIfAvailable(sys/select.h HAVE_SYS_SELECT_H) +DefineFunctionIfAvailable(nanosleep HAVE_NANOSLEEP) +DefineHFileIfAvailable(time.h HAVE_TIME_H) +DefineFunctionIfAvailable(GetSystemTimeAsFileTime HAVE_GETSYSTEMTIMEASFILETIME) + diff --git a/cmake/package.cmake b/cmake/package.cmake new file mode 100644 index 00000000..b63c2863 --- /dev/null +++ b/cmake/package.cmake @@ -0,0 +1,54 @@ +# +# cmake/package --- CMake input file for gawk +# +# Copyright (C) 2013 +# the Free Software Foundation, Inc. +# +# This file is part of GAWK, the GNU implementation of the +# AWK Programming Language. +# +# GAWK is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# GAWK is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +# + +## process this file with CMake to produce Makefile + +SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "This is GNU Awk ${GAWK_VERSION}") +set(CPACK_PACKAGE_VENDOR "GNU Project - Free Software Foundation (FSF)") +SET(CPACK_PACKAGE_NAME "gawk") +SET(CPACK_PACKAGE_VERSION "${GAWK_VERSION}") +SET(CPACK_PACKAGE_VERSION_MAJOR "${GAWK_MAJOR_VERSION}") +SET(CPACK_PACKAGE_VERSION_MINOR "${GAWK_MINOR_VERSION}") +SET(CPACK_PACKAGE_VERSION_PATCH "${GAWK_BUGFIX_VERSION}") +SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/COPYING") +SET(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/README") +set(CPACK_PACKAGE_CONTACT "bug-gawk@gnu.org") + +IF (WIN32) + SET(CPACK_GENERATOR "NSIS") + set(CPACK_NSIS_INSTALL_ROOT "C:") + set(CPACK_NSIS_MENU_LINKS "http://www.gnu.org/software/gawk" "GNU Awk") + set(CPACK_NSIS_MUI_ICON "${CMAKE_SOURCE_DIR}/cmake/auk.ico") + set(CPACK_NSIS_MUI_UNIICON "${CMAKE_SOURCE_DIR}/cmake/auk.ico") + set(CPACK_NSIS_CONTACT "bug-gawk@gnu.org") + set(CPACK_NSIS_DISPLAY_NAME "GNU Awk") +ELSE() + SET(CPACK_PACKAGING_INSTALL_PREFIX /usr) + IF(NOT CPACK_GENERATOR) + SET(CPACK_GENERATOR "TGZ") + ENDIF() + message(STATUS "CPACK_GENERATOR set to ${CPACK_GENERATOR}") +ENDIF() + +INCLUDE(CPack) diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt new file mode 100644 index 00000000..86ed9f12 --- /dev/null +++ b/doc/CMakeLists.txt @@ -0,0 +1,82 @@ +# +# doc/CMakeLists.txt --- CMake input file for gawk +# +# Copyright (C) 2013 +# the Free Software Foundation, Inc. +# +# This file is part of GAWK, the GNU implementation of the +# AWK Programming Language. +# +# GAWK is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# GAWK is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +# + +## process this file with CMake to produce Makefile + +if (LATEX_COMPILER) + add_custom_target(doc) + add_custom_command( + TARGET doc + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMAND texi2dvi --clean gawkinet.texi gawk.texi + COMMAND groff -man gawk.1 > gawk.1.ps + COMMAND groff -man igawk.1 > igawk.1.ps + ) + + if (DVIPS_CONVERTER) + add_custom_command( + TARGET doc + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMAND dvips -o gawk.ps gawk.dvi + COMMAND dvips -o gawkinet.ps gawkinet.dvi + ) + if (PS2PDF_CONVERTER) + add_custom_command( + TARGET doc + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMAND ps2pdf gawk.1.ps gawk.1.pdf + COMMAND ps2pdf igawk.1.ps igawk.1.pdf + COMMAND ps2pdf gawk.ps gawk.pdf + COMMAND ps2pdf gawkinet.ps gawkinet.pdf + ) + else() + message(WARNING "Found no PS2PDF_CONVERTER; no doc will be generated") + endif() + else() + message(WARNING "Found no DVIPS_CONVERTER; no doc will be generated") + endif() +else() + message(WARNING "Found no LATEX_COMPILER; no doc will be generated") +endif() + +if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/gawk.1.pdf) + install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gawk.1.pdf DESTINATION doc) +else() + message(STATUS "No file gawk.1.pdf will be built into package") +endif() +if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/igawk.1.pdf) + install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/igawk.1.pdf DESTINATION doc) +else() + message(STATUS "No file igawk.1.pdf will be built into package") +endif() +if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/gawk.pdf) + install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gawk.pdf DESTINATION doc) +else() + message(STATUS "No file gawk.pdf will be built into package") +endif() +if (EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/gawkinet.pdf) + install(FILES ${CMAKE_CURRENT_SOURCE_DIR}/gawkinet.pdf DESTINATION doc) +else() + message(STATUS "No file gawkinet.pdf will be built into package") +endif() diff --git a/extension/CMakeLists.txt b/extension/CMakeLists.txt new file mode 100644 index 00000000..bb4d4e5c --- /dev/null +++ b/extension/CMakeLists.txt @@ -0,0 +1,87 @@ +# +# extension/CMakeLists.txt --- CMake input file for gawk +# +# Copyright (C) 2013 +# the Free Software Foundation, Inc. +# +# This file is part of GAWK, the GNU implementation of the +# AWK Programming Language. +# +# GAWK is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# GAWK is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +# + +## process this file with CMake to produce Makefile + +remove_definitions(-DGAWK) + +MACRO(BuildExtension name sources) + add_library (${name} MODULE ${sources}) + target_link_libraries(${name}) + set_target_properties(${name} PROPERTIES PREFIX "") + install(PROGRAMS ${CMAKE_BINARY_DIR}/extension/${name}${CMAKE_SHARED_LIBRARY_SUFFIX} DESTINATION lib) +ENDMACRO(BuildExtension) + +if (${HAVE_STRUCT_STAT_ST_BLKSIZE}) + BuildExtension(filefuncs filefuncs.c stack.c gawkfts.c) +else() + message(STATUS "extension filefuncs cannot be built because HAVE_STRUCT_STAT_ST_BLKSIZE is missing") +endif() + +if (${HAVE_FNMATCH} AND ${HAVE_FNMATCH_H}) + BuildExtension(fnmatch fnmatch.c) +else() + message(STATUS "extension fnmatch cannot be built because function fnmatch or fnmatch.h is missing") +endif() + +if (${HAVE_SYS_WAIT_H}) + BuildExtension(fork fork.c) +else() + message(STATUS "extension fork cannot be built because HAVE_SYS_WAIT_H is missing") +endif() + +if (${HAVE_MKSTEMP}) + BuildExtension(inplace inplace.c) +else() + message(STATUS "extension inplace cannot be built because HAVE_MKSTEMP is missing") +endif() + +BuildExtension(ordchr ordchr.c) + +if (HAVE_DIRENT_H AND HAVE_DIRFD) + BuildExtension(readdir readdir.c) +else() + message(STATUS "extension readdir cannot be built because function readdir is missing") +endif() + +BuildExtension(readfile readfile.c) + +BuildExtension(revoutput revoutput.c) + +if (${HAVE_GETDTABLESIZE}) + BuildExtension(revtwoway revtwoway.c) +else() + message(STATUS "extension revtwoway cannot be built because function getdtablesize is missing") +endif() + +if (${HAVE_ARPA_INET_H}) + BuildExtension(rwarray rwarray.c) +else() + message(STATUS "extension rwarray cannot be built because HAVE_ARPA_INET_H is missing") +endif() + +BuildExtension(time time.c) + +BuildExtension(testext testext.c) + diff --git a/po/CMakeLists.txt b/po/CMakeLists.txt new file mode 100644 index 00000000..cd930077 --- /dev/null +++ b/po/CMakeLists.txt @@ -0,0 +1,133 @@ +# Most of this copied from the repository of Stellarium +# http://sourceforge.net/projects/stellarium/ + +# Special targets for translations: +# +# translations +# Converts all PO files to GMO files. Note that it does *not* update +# the PO files or the PO templates -- in fact, these files are never +# updated automatically. +# +# generate-pot +# Re-creates all POT files unconditionally. +# +# update-po +# Updates all PO files unconditionally. Note that it takes care of +# updating the POT files. +# +# translations-<DOMAIN> +# generate-pot-<DOMAIN> +# update-po-<DOMAIN> +# Same as above, but only affect the files in the corresponding +# po/<DOMAIN> directory. (DOMAIN is actually the base name of the POT +# file in the subdirectory, but that should match the directory name +# anyway.) + +ADD_CUSTOM_TARGET(translations) +ADD_CUSTOM_TARGET(generate-pot) +ADD_CUSTOM_TARGET(update-po) + +# GETTEXT_CREATE_TRANSLATIONS(domain [DEFAULT_TARGET] lang1 ... langN) +# +# Creates custom build rules to create and install (G)MO files for the +# specified languages. If the DEFAULT_TARGET option is used, the +# translations will also be created when building the default target. +# +# "domain" is the translation domain, eg. "gawk". A POT file +# with the name ${domain}.pot must exist in the directory of the +# CMakeLists.txt file invoking the macro. +# +# This macro also creates the "translations-${domain}" and +# "update-po-${domain}" targets (see above for an explanation). +# +MACRO(GETTEXT_CREATE_TRANSLATIONS _domain _firstLang) + + SET(_gmoFiles) + GET_FILENAME_COMPONENT(_absPotFile ${_domain}.pot ABSOLUTE) + + # Update these PO files when building the "update-po-<DOMAIN>" and + # "update-po" targets. + ADD_CUSTOM_TARGET(update-po-${_domain}) + ADD_DEPENDENCIES(update-po update-po-${_domain}) + + # Make sure the POT file is updated before updating the PO files. + ADD_DEPENDENCIES(update-po-${_domain} generate-pot-${_domain}) + + SET(_addToAll) + IF(${_firstLang} STREQUAL "DEFAULT_TARGET") + SET(_addToAll "ALL") + SET(_firstLang) + ENDIF(${_firstLang} STREQUAL "DEFAULT_TARGET") + + FOREACH (_lang ${ARGN}) + GET_FILENAME_COMPONENT(_absFile ${_lang}.po ABSOLUTE) + FILE(RELATIVE_PATH _relFile ${PROJECT_SOURCE_DIR} ${_absFile}) + SET(_gmoFile ${CMAKE_CURRENT_BINARY_DIR}/${_lang}.gmo) + + # Convert a PO file into a GMO file. + ADD_CUSTOM_COMMAND( + OUTPUT ${_gmoFile} + COMMAND ${GETTEXT_MSGFMT_EXECUTABLE} -o ${_gmoFile} ${_absFile} + DEPENDS ${_absFile} + ) + + # Update the PO file unconditionally when building the + # "update-po-<DOMAIN>" target. Note that to see the file being + # processed, we have to run "cmake -E echo", because the + # COMMENT is not displayed by cmake... + ADD_CUSTOM_COMMAND( + TARGET update-po-${_domain} + POST_BUILD + COMMAND ${CMAKE_COMMAND} -E echo "** Updating ${_relFile}" + COMMAND ${GETTEXT_MSGMERGE_EXECUTABLE} + --quiet --update -m --backup=none -s + ${_absFile} ${_absPotFile} + VERBATIM + ) + + INSTALL(FILES ${_gmoFile} DESTINATION share/locale/${_lang}/LC_MESSAGES RENAME ${_domain}.mo) + SET(_gmoFiles ${_gmoFiles} ${_gmoFile}) + + ENDFOREACH (_lang) + + # Create the GMO files when building the "translations-<DOMAIN>" and + # "translations" targets. + ADD_CUSTOM_TARGET(translations-${_domain} ${_addToAll} DEPENDS ${_gmoFiles}) + ADD_DEPENDENCIES(translations translations-${_domain}) + +ENDMACRO(GETTEXT_CREATE_TRANSLATIONS ) + +SET(gawk_DOMAIN gawk) +SET(gawk_POT ${gawk_DOMAIN}.pot) + +file(READ LINGUAS linguas) +string(REGEX REPLACE "\n" ";" linguas ${linguas}) +GETTEXT_CREATE_TRANSLATIONS(${gawk_DOMAIN} DEFAULT_TARGET ${linguas}) + +ADD_CUSTOM_TARGET( + generate-pot-${gawk_DOMAIN} + ${GETTEXT_XGETTEXT_EXECUTABLE} + -o ${CMAKE_CURRENT_SOURCE_DIR}/${gawk_POT} + -C + --keyword=_ + --keyword=N_ + --keyword=q_ + --keyword=translate:2 + --add-comments=TRANSLATORS: + --directory=${CMAKE_BINARY_DIR} + --directory=${CMAKE_SOURCE_DIR} + --output-dir=${CMAKE_BINARY_DIR} + --files-from=${CMAKE_CURRENT_SOURCE_DIR}/POTFILES.in + --copyright-holder=FSF + WORKING_DIRECTORY ${PROJECT_SOURCE_DIR} + COMMENT "Generating ${gawk_POT}" + VERBATIM +) +# TODO: It would be nice to just depend on the exact files in POTFILES.in +#file(READ ${CMAKE_CURRENT_SOURCE_DIR}/${gawk_POT} UiHeaders) +#ADD_DEPENDENCIES(generate-pot-${gawk_DOMAIN} UiHeaders) +#ADD_DEPENDENCIES(generate-pot-${gawk_DOMAIN} gawk_UIS_H) +# Make sure the UI headers are created first. +ADD_DEPENDENCIES(generate-pot-${gawk_DOMAIN} StelGuiLib) # ??? FIXME +# Generate this POT file when building the "generate-pot" target. +ADD_DEPENDENCIES(generate-pot generate-pot-${gawk_DOMAIN}) diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 00000000..5f36c754 --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,51 @@ +# +# test/CMakeLists.txt --- CMake input file for gawk +# +# Copyright (C) 2013 +# the Free Software Foundation, Inc. +# +# This file is part of GAWK, the GNU implementation of the +# AWK Programming Language. +# +# GAWK is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# GAWK is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA +# + +## process this file with CMake to produce Makefile + +execute_process( + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/ + COMMAND awk /:$/ Maketests + OUTPUT_VARIABLE BASIC_TESTS +) + +string(REGEX REPLACE "Gt-dummy:\n" "" BASIC_TESTS ${BASIC_TESTS}) +string(REGEX REPLACE ":\n" ";" BASIC_TESTS ${BASIC_TESTS}) +foreach(testcase ${BASIC_TESTS} ) + set(options "") + if(${testcase} STREQUAL lintold) + set(options "--lint-old") + endif() + if(${testcase} STREQUAL defref OR ${testcase} STREQUAL fmtspcl OR + ${testcase} STREQUAL lintwarn OR ${testcase} STREQUAL noeffect OR + ${testcase} STREQUAL nofmtch OR ${testcase} STREQUAL shadow OR + ${testcase} STREQUAL uninit2 OR ${testcase} STREQUAL uninit3 OR + ${testcase} STREQUAL uninit4 OR ${testcase} STREQUAL uninit5 OR + ${testcase} STREQUAL uninitialized) + set(options "--lint") + endif() + + add_test(${testcase} ${CMAKE_SOURCE_DIR}/cmake/basictest ${CMAKE_BINARY_DIR}/gawk ${testcase} ${options} ) +endforeach(testcase) + |