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		COMPILE_PDB_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
35		SOVERSION                    ${CARES_LIB_VERSION_MAJOR}
36		VERSION                      "${CARES_LIB_VERSION_MAJOR}.${CARES_LIB_VERSION_MINOR}.${CARES_LIB_VERSION_RELEASE}"
37		C_STANDARD                   90
38	)
39
40	IF (CARES_SYMBOL_HIDING)
41		SET_TARGET_PROPERTIES (${PROJECT_NAME} PROPERTIES
42			C_VISIBILITY_PRESET hidden
43			VISIBILITY_INLINES_HIDDEN YES
44		)
45	ENDIF ()
46
47	TARGET_INCLUDE_DIRECTORIES (${PROJECT_NAME}
48		PUBLIC "$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}>"
49		       "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>"
50		       "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>"
51		       "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
52		PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}"
53	)
54
55	TARGET_COMPILE_DEFINITIONS (${PROJECT_NAME} PRIVATE HAVE_CONFIG_H=1 CARES_BUILDING_LIBRARY)
56
57	TARGET_LINK_LIBRARIES (${PROJECT_NAME}
58		PUBLIC ${CARES_DEPENDENT_LIBS}
59		PRIVATE ${CMAKE_THREAD_LIBS_INIT}
60	)
61
62	IF (CARES_INSTALL)
63		INSTALL (TARGETS ${PROJECT_NAME}
64			EXPORT ${PROJECT_NAME}-targets
65			COMPONENT Library
66			${TARGETS_INST_DEST}
67		)
68		INSTALL(FILES ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/cares.pdb
69			DESTINATION ${CMAKE_INSTALL_BINDIR}
70			COMPONENT Library
71			OPTIONAL
72		)
73	ENDIF ()
74	SET (STATIC_SUFFIX "_static")
75
76	# For chain building: add alias targets that look like import libs that would be returned by find_package(c-ares).
77	ADD_LIBRARY (${PROJECT_NAME}::cares_shared ALIAS ${PROJECT_NAME})
78	ADD_LIBRARY (${PROJECT_NAME}::cares        ALIAS ${PROJECT_NAME})
79ENDIF ()
80
81# Build the static library
82IF (CARES_STATIC)
83	SET (LIBNAME ${PROJECT_NAME}${STATIC_SUFFIX})
84
85	ADD_LIBRARY (${LIBNAME} STATIC ${CSOURCES})
86
87	SET_TARGET_PROPERTIES (${LIBNAME} PROPERTIES
88		EXPORT_NAME                  cares${STATIC_SUFFIX}
89		OUTPUT_NAME                  cares${STATIC_SUFFIX}
90		COMPILE_PDB_NAME             cares${STATIC_SUFFIX}
91		COMPILE_PDB_OUTPUT_DIRECTORY ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}
92		C_STANDARD                   90
93	)
94
95	IF (CARES_STATIC_PIC)
96		SET_TARGET_PROPERTIES (${LIBNAME} PROPERTIES POSITION_INDEPENDENT_CODE True)
97	ENDIF ()
98
99	TARGET_INCLUDE_DIRECTORIES (${LIBNAME}
100		PUBLIC "$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}>"
101		       "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}>"
102		       "$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>"
103		       "$<INSTALL_INTERFACE:${CMAKE_INSTALL_INCLUDEDIR}>"
104		PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}"
105	)
106
107	TARGET_COMPILE_DEFINITIONS (${LIBNAME} PRIVATE HAVE_CONFIG_H=1 CARES_BUILDING_LIBRARY)
108
109	# Only matters on Windows
110	IF (WIN32 OR CYGWIN)
111		TARGET_COMPILE_DEFINITIONS (${LIBNAME} PUBLIC CARES_STATICLIB)
112	ENDIF()
113
114	TARGET_LINK_LIBRARIES (${LIBNAME} PUBLIC ${CARES_DEPENDENT_LIBS})
115	IF (CARES_INSTALL)
116		INSTALL (TARGETS ${LIBNAME} EXPORT ${PROJECT_NAME}-targets COMPONENT Devel
117			${TARGETS_INST_DEST}
118		)
119		INSTALL(FILES ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/cares${STATIC_SUFFIX}.pdb
120			DESTINATION ${CMAKE_INSTALL_BINDIR}
121			COMPONENT Library
122			OPTIONAL
123		)
124	ENDIF ()
125
126	# For chain building: add alias targets that look like import libs that would be returned by find_package(c-ares).
127	ADD_LIBRARY (${PROJECT_NAME}::cares_static ALIAS ${LIBNAME})
128	IF (NOT TARGET ${PROJECT_NAME}::cares)
129		# Only use static for the generic alias if shared lib wasn't built.
130		ADD_LIBRARY (${PROJECT_NAME}::cares ALIAS ${LIBNAME})
131	ENDIF ()
132ENDIF ()
133
134
135
136
137