• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1# Copyright (C) The c-ares project and its contributors
2# SPDX-License-Identifier: MIT
3
4# Transform Makefile.inc
5transform_makefile_inc("Makefile.inc" "${PROJECT_BINARY_DIR}/src/lib/Makefile.inc.cmake")
6include(${PROJECT_BINARY_DIR}/src/lib/Makefile.inc.cmake)
7
8# Write ares_config.h configuration file.  This is used only for the build.
9CONFIGURE_FILE (ares_config.h.cmake ${PROJECT_BINARY_DIR}/ares_config.h)
10
11# Build the dynamic/shared library
12IF (CARES_SHARED)
13	ADD_LIBRARY (${PROJECT_NAME} SHARED ${CSOURCES})
14
15	# Include resource file in windows builds for versioned DLLs
16	IF (WIN32)
17		TARGET_SOURCES (${PROJECT_NAME} PRIVATE cares.rc)
18	ENDIF()
19
20	# Convert CARES_LIB_VERSIONINFO libtool version format into VERSION and SOVERSION
21	# Convert from ":" separated into CMake list format using ";"
22	STRING (REPLACE ":" ";" CARES_LIB_VERSIONINFO ${CARES_LIB_VERSIONINFO})
23	LIST (GET CARES_LIB_VERSIONINFO 0 CARES_LIB_VERSION_CURRENT)
24	LIST (GET CARES_LIB_VERSIONINFO 1 CARES_LIB_VERSION_REVISION)
25	LIST (GET CARES_LIB_VERSIONINFO 2 CARES_LIB_VERSION_AGE)
26	MATH (EXPR CARES_LIB_VERSION_MAJOR "${CARES_LIB_VERSION_CURRENT} - ${CARES_LIB_VERSION_AGE}")
27	SET  (CARES_LIB_VERSION_MINOR "${CARES_LIB_VERSION_AGE}")
28	SET  (CARES_LIB_VERSION_RELEASE "${CARES_LIB_VERSION_REVISION}")
29
30	SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES
31		EXPORT_NAME                  cares
32		OUTPUT_NAME                  cares
33		COMPILE_PDB_NAME             cares
34		SOVERSION                    ${CARES_LIB_VERSION_MAJOR}
35		VERSION                      "${CARES_LIB_VERSION_MAJOR}.${CARES_LIB_VERSION_MINOR}.${CARES_LIB_VERSION_RELEASE}"
36		C_STANDARD                   90
37	)
38
39	IF (ANDROID)
40		SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES C_STANDARD 99)
41	ENDIF ()
42
43	IF (CARES_SYMBOL_HIDING)
44		SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES
45			C_VISIBILITY_PRESET hidden
46			VISIBILITY_INLINES_HIDDEN YES
47		)
48	ENDIF ()
49
50	TARGET_INCLUDE_DIRECTORIES (${PROJECT_NAME}
51		PUBLIC "$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}>"
52		       "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>"
53		       "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>"
54		       "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
55		PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}"
56		        "${CMAKE_CURRENT_SOURCE_DIR}/include"
57	)
58
59	TARGET_COMPILE_DEFINITIONS (${PROJECT_NAME} PRIVATE HAVE_CONFIG_H=1 CARES_BUILDING_LIBRARY)
60
61	TARGET_LINK_LIBRARIES (${PROJECT_NAME}
62		PUBLIC ${CARES_DEPENDENT_LIBS}
63		PRIVATE ${CMAKE_THREAD_LIBS_INIT}
64	)
65
66	IF (CARES_INSTALL)
67		INSTALL (TARGETS ${PROJECT_NAME}
68			EXPORT ${PROJECT_NAME}-targets
69			COMPONENT Library
70			${TARGETS_INST_DEST}
71		)
72		IF (MSVC)
73			INSTALL(FILES $<TARGET_PDB_FILE:${PROJECT_NAME}>
74			        DESTINATION ${CMAKE_INSTALL_BINDIR}
75				COMPONENT Library
76				OPTIONAL
77			)
78		ENDIF ()
79	ENDIF ()
80	SET (STATIC_SUFFIX "_static")
81
82	# For chain building: add alias targets that look like import libs that would be returned by find_package(c-ares).
83	ADD_LIBRARY (${PROJECT_NAME}::cares_shared ALIAS ${PROJECT_NAME})
84	ADD_LIBRARY (${PROJECT_NAME}::cares        ALIAS ${PROJECT_NAME})
85ENDIF ()
86
87# Build the static library
88IF (CARES_STATIC)
89	SET (LIBNAME ${PROJECT_NAME}${STATIC_SUFFIX})
90
91	ADD_LIBRARY (${LIBNAME} STATIC ${CSOURCES})
92
93	SET_TARGET_PROPERTIES (${LIBNAME} PROPERTIES
94		EXPORT_NAME                  cares${STATIC_SUFFIX}
95		COMPILE_PDB_NAME             cares${STATIC_SUFFIX}
96		C_STANDARD                   90
97	)
98
99	# On Windows, the output name should have a static suffix since otherwise
100	# we would have conflicting output names (libcares.lib) for the link
101	# library.
102	# However on Unix-like systems, we typically have something like
103	# libcares.so  for shared libraries  and libcares.a for static
104	# libraries, so these don't conflict.
105	# This behavior better emulates what happens with autotools builds
106	IF (WIN32)
107		SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES OUTPUT_NAME cares${STATIC_SUFFIX})
108	ELSE ()
109		SET_TARGET_PROPERTIES(${LIBNAME} PROPERTIES OUTPUT_NAME cares)
110	ENDIF()
111
112	IF (ANDROID)
113		SET_TARGET_PROPERTIES (${LIBNAME} PROPERTIES C_STANDARD 99)
114	ENDIF ()
115
116	IF (CARES_STATIC_PIC)
117		SET_TARGET_PROPERTIES (${LIBNAME} PROPERTIES POSITION_INDEPENDENT_CODE True)
118	ENDIF ()
119
120	TARGET_INCLUDE_DIRECTORIES (${LIBNAME}
121		PUBLIC "$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}>"
122		       "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>"
123		       "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>"
124		       "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
125		PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}"
126		        "${CMAKE_CURRENT_SOURCE_DIR}/include"
127	)
128
129	TARGET_COMPILE_DEFINITIONS (${LIBNAME} PRIVATE HAVE_CONFIG_H=1 CARES_BUILDING_LIBRARY)
130
131	# Only matters on Windows
132	IF (WIN32 OR CYGWIN)
133		TARGET_COMPILE_DEFINITIONS (${LIBNAME} PUBLIC CARES_STATICLIB)
134	ENDIF()
135
136	TARGET_LINK_LIBRARIES (${LIBNAME} PUBLIC ${CARES_DEPENDENT_LIBS})
137	IF (CARES_INSTALL)
138		INSTALL (TARGETS ${LIBNAME} EXPORT ${PROJECT_NAME}-targets COMPONENT Devel
139			${TARGETS_INST_DEST}
140		)
141	ENDIF ()
142
143	# For chain building: add alias targets that look like import libs that would be returned by find_package(c-ares).
144	ADD_LIBRARY (${PROJECT_NAME}::cares_static ALIAS ${LIBNAME})
145	IF (NOT TARGET ${PROJECT_NAME}::cares)
146		# Only use static for the generic alias if shared lib wasn't built.
147		ADD_LIBRARY (${PROJECT_NAME}::cares ALIAS ${LIBNAME})
148	ENDIF ()
149ENDIF ()
150
151
152
153
154