aboutsummaryrefslogtreecommitdiff
path: root/ports/libconfuse/CMakeLists.txt
blob: 651dab2f068e133ec2fb2692256980f6048ca522 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
cmake_minimum_required(VERSION 3.14)

set(ac_init_line_re "AC_INIT\\(([^,]+), ([^,]+), ([^,]+), ([^)]+)\\)")
file(STRINGS
    ${CMAKE_CURRENT_LIST_DIR}/configure.ac
    ac_init_line
    REGEX ${ac_init_line_re}
)

string(REGEX REPLACE "${ac_init_line_re}" "\\1" PACKAGE_NAME      ${ac_init_line})
string(REGEX REPLACE "${ac_init_line_re}" "\\2" PACKAGE_VERSION   ${ac_init_line})
string(REGEX REPLACE "${ac_init_line_re}" "\\3" PACKAGE_BUGREPORT ${ac_init_line})
string(REGEX REPLACE "${ac_init_line_re}" "\\4" PACKAGE           ${ac_init_line})

set(PACKAGE_TARNAME ${PACKAGE})
set(PACKAGE_STRING  "${PACKAGE_NAME} ${PACKAGE_VERSION}")

string(REGEX REPLACE "([0-9]+.[0-9]+.[0-9]+).*" "\\1" SEMANTIC_VERSION ${PACKAGE_VERSION})

project(libconfuse VERSION ${SEMANTIC_VERSION} LANGUAGES C)

include(CheckFunctionExists)
include(CheckIncludeFile)
include(GNUInstallDirs)

find_package(FLEX REQUIRED)
find_package(Gettext QUIET)
find_package(Intl QUIET)

set(CMAKE_DISABLE_SOURCE_CHANGES ON)
set(CMAKE_DISABLE_IN_SOURCE_BUILD ON)

if (GETTEXT_FOUND)
    set(ENABLE_NLS 1)
endif ()

# libconfig.pc.in
set(prefix ${CMAKE_INSTALL_PREFIX})
set(exec_prefix ${prefix})
set(libdir ${prefix}/${CMAKE_INSTALL_LIBDIR})
set(includedir ${prefix}/${CMAKE_INSTALL_INCLUDEDIR})
set(VERSION ${PROJECT_VERSION})

if (Intl_FOUND AND Intl_LIBRARIES)
    set(LTLIBINTL ${Intl_LIBRARIES})
endif ()

configure_file(libconfuse.pc.in ${CMAKE_CURRENT_BINARY_DIR}/libconfuse.pc @ONLY)

check_function_exists(dcgettext  HAVE_DCGETTEXT)
check_function_exists(fmemopen   HAVE_FMEMOPEN)
check_function_exists(funopen    HAVE_FUNOPEN)
check_function_exists(gettext    HAVE_GETTEXT)
check_function_exists(iconv      HAVE_ICONV)
check_function_exists(strcasecmp HAVE_STRCASECMP)
check_function_exists(strdup     HAVE_STRDUP)
check_function_exists(_strdup    HAVE__STRDUP)
check_function_exists(strndup    HAVE_STRNDUP)
check_function_exists(setenv     HAVE_SETENV)
check_function_exists(unsetenv   HAVE_UNSETENV)
check_function_exists(_putenv    HAVE__PUTENV)

if (MSVC)
    check_function_exists(_fileno  HAVE__FILENO)
    check_function_exists(_isatty  HAVE__ISATTY)
    check_function_exists(_stricmp HAVE_STRCASECMP)
endif ()

check_include_file(stdlib.h HAVE_STDLIB_H)
check_include_file(string.h HAVE_STRING_H)

check_include_file(strings.h   HAVE_STRINGS_H)
check_include_file(sys/stat.h  HAVE_SYS_STAT_H)
check_include_file(sys/types.h HAVE_SYS_TYPES_H)
check_include_file(unistd.h    HAVE_UNISTD_H)
check_include_file(windows.h   HAVE_WINDOWS_H)

configure_file(config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)

flex_target(
    CONFUSE
    src/lexer.l 
    ${CMAKE_CURRENT_BINARY_DIR}/lexer.c
    COMPILE_FLAGS -Pcfg_yy
)

set(libconfuse_sources
    src/confuse.c
    ${FLEX_CONFUSE_OUTPUTS}
)

if (NOT HAVE_FMEMOPEN)
    list(APPEND libconfuse_sources src/fmemopen.c)
endif ()

add_library(libconfuse ${libconfuse_sources})

if (BUILD_SHARED_LIBS)
    if (WIN32)
        target_compile_definitions(libconfuse PRIVATE BUILDING_DLL)
    endif ()
else ()
    target_compile_definitions(libconfuse PUBLIC BUILDING_STATIC)
endif ()

string(COMPARE EQUAL "${CMAKE_C_COMPILER_ID}" "GNU" USING_GNUC)

target_compile_definitions(libconfuse
    PUBLIC
        $<BUILD_INTERFACE:HAVE_CONFIG_H>
    PRIVATE
        $<$<BOOL:${MSVC}>:_CRT_SECURE_NO_WARNINGS>
        $<$<BOOL:${MSVC}>:_CRT_NONSTDC_NO_DEPRECATE>
        $<$<BOOL:${MSVC}>:strcasecmp=_stricmp>
        $<$<BOOL:${USING_GNUC}>:_GNU_SOURCE>
)

target_include_directories(libconfuse
    PUBLIC
        $<BUILD_INTERFACE:${CMAKE_CURRENT_LIST_DIR}/src>
        $<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
        $<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>
)

set_target_properties(libconfuse PROPERTIES PUBLIC_HEADER src/confuse.h)

install(TARGETS libconfuse EXPORT unofficial-libconfuse-config)

install(
    EXPORT unofficial-libconfuse-config
    NAMESPACE unofficial::libconfuse::
    DESTINATION share/unofficial-libconfuse
    PERMISSIONS OWNER_READ OWNER_WRITE GROUP_READ WORLD_READ
)

install(
    FILES ${CMAKE_CURRENT_BINARY_DIR}/libconfuse.pc
    DESTINATION ${CMAKE_INSTALL_LIBDIR}/pkgconfig
)