LibiconvCMakeLists.txt (5047B)
1 cmake_minimum_required(VERSION 3.16) 2 project(libiconv C) 3 4 add_compile_options(-w) 5 6 include_directories( 7 ${CMAKE_CURRENT_SOURCE_DIR} 8 ${CMAKE_CURRENT_SOURCE_DIR}/srclib 9 ${CMAKE_CURRENT_BINARY_DIR} 10 ${CMAKE_CURRENT_BINARY_DIR}/srclib 11 ${CMAKE_CURRENT_SOURCE_DIR}/build-aux/snippet) 12 13 configure_file(config.h.in config.h) 14 file(READ "${CMAKE_CURRENT_BINARY_DIR}/config.h" CONFIG_CONTENT) 15 string(REPLACE "#undef EILSEQ" "" CONFIG_CONTENT "${CONFIG_CONTENT}") 16 string(REPLACE "#undef HAVE_MBRTOWC" "#define HAVE_MBRTOWC 1" CONFIG_CONTENT "${CONFIG_CONTENT}") 17 string(REPLACE "#undef HAVE_MBSINIT" "#define HAVE_MBSINIT 1" CONFIG_CONTENT "${CONFIG_CONTENT}") 18 string(REPLACE "#undef HAVE_WCRTOMB" "#define HAVE_WCRTOMB 1" CONFIG_CONTENT "${CONFIG_CONTENT}") 19 string(REPLACE "#undef HAVE_DECL___ARGV" "#define HAVE_DECL___ARGV 1" CONFIG_CONTENT "${CONFIG_CONTENT}") 20 string(REPLACE "#undef HAVE_WORKING_O_NOFOLLOW" "#define HAVE_WORKING_O_NOFOLLOW 0" CONFIG_CONTENT "${CONFIG_CONTENT}") 21 string(REPLACE "#undef ICONV_CONST" "#define ICONV_CONST const" CONFIG_CONTENT "${CONFIG_CONTENT}") 22 string(REPLACE "#undef WORDS_LITTLEENDIAN" "#define WORDS_LITTLEENDIAN 1" CONFIG_CONTENT "${CONFIG_CONTENT}") 23 string(REPLACE "#undef HAVE_DECL_STRERROR_R" "#define HAVE_DECL_STRERROR_R 0" CONFIG_CONTENT "${CONFIG_CONTENT}") 24 string(REPLACE "#undef mode_t" "#define mode_t int" CONFIG_CONTENT "${CONFIG_CONTENT}") 25 string(REPLACE "#undef ssize_t" "#include <BaseTsd.h>\n#define ssize_t SSIZE_T" CONFIG_CONTENT "${CONFIG_CONTENT}") 26 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/config.h" "${CONFIG_CONTENT}") 27 28 set(BROKEN_WCHAR_H 0) 29 set(HAVE_VISIBILITY 0) 30 set(HAVE_WCHAR_T 1) 31 set(ICONV_CONST "const") 32 set(USE_MBSTATE_T 0) 33 configure_file(libcharset/include/localcharset.h.build.in localcharset.h) 34 configure_file(include/iconv.h.build.in iconv.h) 35 36 add_definitions(-DLIBDIR) 37 38 add_library(libcharset libcharset/lib/localcharset.c) 39 40 add_library(libiconv lib/iconv.c) 41 target_link_libraries(libiconv libcharset) 42 43 add_executable(iconv src/iconv.c srclib/progname.c srclib/getprogname.c 44 srclib/safe-read.c srclib/uniwidth/width.c srclib/error.c srclib/xmalloc.c 45 srclib/basename-lgpl.c) 46 target_link_libraries(iconv libiconv) 47 48 set(HEADER_TEMPLATES_PATH "srclib") 49 set(HEADER_TEMPLATES_ABS_PATH "${CMAKE_CURRENT_SOURCE_DIR}/${HEADER_TEMPLATES_PATH}") 50 file(GLOB_RECURSE HEADER_TEMPLATES "${HEADER_TEMPLATES_ABS_PATH}/*.in.h") 51 list(REMOVE_ITEM HEADER_TEMPLATES "${HEADER_TEMPLATES_ABS_PATH}/stdint.in.h") 52 list(REMOVE_ITEM HEADER_TEMPLATES "${HEADER_TEMPLATES_ABS_PATH}/wchar.in.h") 53 foreach(HEADER_TEMPLATE ${HEADER_TEMPLATES}) 54 file(READ ${HEADER_TEMPLATE} HEADER_CONTENT) 55 string(REPLACE "/* The definition of _GL_ARG_NONNULL is copied here. */" "#include \"arg-nonnull.h\"" HEADER_CONTENT "${HEADER_CONTENT}") 56 string(REPLACE "/* The definition of _GL_WARN_ON_USE is copied here. */" "#include \"warn-on-use.h\"" HEADER_CONTENT "${HEADER_CONTENT}") 57 string(REPLACE "/* The definitions of _GL_FUNCDECL_RPL etc. are copied here. */" "#include \"c++defs.h\"" HEADER_CONTENT "${HEADER_CONTENT}") 58 string(REPLACE "@GNULIB_LSTAT@" "1" HEADER_CONTENT "${HEADER_CONTENT}") 59 string(REPLACE "@GNULIB_SIGACTION@" "1" HEADER_CONTENT "${HEADER_CONTENT}") 60 string(REPLACE "@GNULIB_SIGPROCMASK@" "1" HEADER_CONTENT "${HEADER_CONTENT}") 61 string(REPLACE "@HAVE_ISWCNTRL@" "1" HEADER_CONTENT "${HEADER_CONTENT}") 62 string(REPLACE "@HAVE_WCTYPE_T@" "1" HEADER_CONTENT "${HEADER_CONTENT}") 63 string(REPLACE "@PRAGMA_COLUMNS@" "" HEADER_CONTENT "${HEADER_CONTENT}") 64 65 string(REGEX REPLACE "^${HEADER_TEMPLATES_ABS_PATH}/" "" HEADER_PATH "${HEADER_TEMPLATE}") 66 string(REPLACE ".in" "" HEADER_PATH ${HEADER_PATH}) 67 string(REPLACE "_" "/" HEADER_PATH ${HEADER_PATH}) 68 # find_file will create a cache entry for the variable 69 # SYSTEM_HEADER, so reset it before each call 70 set(SYSTEM_HEADER "SYSTEM_HEADER-NOTFOUND") 71 find_file(SYSTEM_HEADER ${HEADER_PATH} PATHS "${LIBICONV_INCLUDE_DIRS}") 72 if(SYSTEM_HEADER) 73 # Gnulib uses #include_next to extend system header files, 74 # but MSVC doesn't support it, so a regular include directive 75 # with a relative path is used instead 76 string(REGEX REPLACE ".*/(.*/${HEADER_PATH})" "../\\1" 77 INCLUDE_PATH "${SYSTEM_HEADER}") 78 string(REGEX REPLACE "@INCLUDE_NEXT[^@]*@ @NEXT_[^@\n]+@" 79 "include <${INCLUDE_PATH}>" HEADER_CONTENT "${HEADER_CONTENT}") 80 endif() 81 82 # Default any remaining template variables to 0 83 string(REGEX REPLACE "@[^@\n]+@" "0" HEADER_CONTENT "${HEADER_CONTENT}") 84 85 file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/${HEADER_TEMPLATES_PATH}/${HEADER_PATH}" "${HEADER_CONTENT}") 86 endforeach() 87 88 include(GNUInstallDirs) 89 90 install(FILES 91 ${CMAKE_CURRENT_BINARY_DIR}/iconv.h 92 ${CMAKE_CURRENT_BINARY_DIR}/localcharset.h 93 DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) 94 95 install(TARGETS libcharset libiconv iconv 96 ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} 97 LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} 98 PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} 99 RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}) 100 101 # vim: set ft=cmake: