Skip to content

Commit 8a23790

Browse files
committed
CDRIVER-2211 add ENABLE_STATIC cmake option
1 parent 8f7ac98 commit 8a23790

File tree

3 files changed

+130
-61
lines changed

3 files changed

+130
-61
lines changed

.evergreen/link-sample-program.sh

Lines changed: 34 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -50,50 +50,31 @@ else
5050
SSL_CMAKE_OPTION="-DENABLE_SSL:BOOL=OFF"
5151
fi
5252

53+
54+
if [ "$LINK_STATIC" ]; then
55+
STATIC_CONFIGURE_OPTION="--enable-static"
56+
STATIC_CMAKE_OPTION="-DENABLE_STATIC=OFF -DENABLE_TESTS=OFF"
57+
fi
58+
59+
5360
if [ "$BUILD_MONGOC_WITH_CMAKE" ]; then
5461
# Our CMake script doesn't build bundled libbson (CDRIVER-1948) so fake it.
5562
cd src/libbson
56-
$CMAKE -DCMAKE_INSTALL_PREFIX=$INSTALL_DIR .
63+
$CMAKE -DCMAKE_INSTALL_PREFIX=$INSTALL_DIR $STATIC_CMAKE_OPTION .
5764
make
5865
make install
5966
cd ../..
6067

61-
# Our CMake build system always installs both dynamic and static libmongoc.
62-
$CMAKE -DCMAKE_INSTALL_PREFIX=$INSTALL_DIR -DCMAKE_PREFIX_PATH=$INSTALL_DIR/lib/cmake $SSL_CMAKE_OPTION .
68+
$CMAKE -DCMAKE_INSTALL_PREFIX=$INSTALL_DIR -DCMAKE_PREFIX_PATH=$INSTALL_DIR/lib/cmake $SSL_CMAKE_OPTION $STATIC_CMAKE_OPTION .
6369
make
6470
make install
65-
EXPECT_STATIC=1
66-
elif [ "$LINK_STATIC" ]; then
67-
./configure --prefix=$INSTALL_DIR --disable-examples $SSL_CONFIGURE_OPTION --enable-static --with-libbson=bundled
68-
make
69-
make install
70-
EXPECT_STATIC=1
7171
else
72-
./configure --prefix=$INSTALL_DIR --disable-examples $SSL_CONFIGURE_OPTION --with-libbson=bundled
72+
./configure --prefix=$INSTALL_DIR --disable-examples $SSL_CONFIGURE_OPTION $STATIC_CONFIGURE_OPTION --with-libbson=bundled
7373
make
7474
make install
75-
if test -f $INSTALL_DIR/lib/libmongoc-static-1.0.a; then
76-
echo "libmongoc-static-1.0.a shouldn't have been installed"
77-
exit 1
78-
fi
79-
if test -f $INSTALL_DIR/lib/libmongoc-1.0.a; then
80-
echo "libmongoc-1.0.a shouldn't have been installed"
81-
exit 1
82-
fi
83-
if test -f $INSTALL_DIR/lib/pkgconfig/libmongoc-static-1.0.pc; then
84-
echo "libmongoc-static-1.0.pc shouldn't have been installed"
85-
exit 1
86-
fi
87-
if test -f $INSTALL_DIR/lib/cmake/libmongoc-static-1.0/libmongoc-static-1.0-config.cmake; then
88-
echo "libmongoc-static-1.0-config.cmake shouldn't have been installed"
89-
exit 1
90-
fi
91-
if test -f $INSTALL_DIR/lib/cmake/libmongoc-static-1.0/libmongoc-static-1.0-config-version.cmake; then
92-
echo "libmongoc-static-1.0-config-version.cmake shouldn't have been installed"
93-
exit 1
94-
fi
9575
fi
9676

77+
9778
LIB=$INSTALL_DIR/lib/libmongoc-1.0.$SO
9879
if test ! -L $LIB; then
9980
echo "$LIB should be a symlink"
@@ -135,7 +116,8 @@ else
135116
echo "libmongoc-1.0-config-version.cmake check ok"
136117
fi
137118

138-
if [ "$EXPECT_STATIC" ]; then
119+
120+
if [ "$LINK_STATIC" ]; then
139121
if test ! -f $INSTALL_DIR/lib/libmongoc-static-1.0.a; then
140122
echo "libmongoc-static-1.0.a missing!"
141123
exit 1
@@ -160,6 +142,27 @@ if [ "$EXPECT_STATIC" ]; then
160142
else
161143
echo "libmongoc-static-1.0-config-version.cmake check ok"
162144
fi
145+
else
146+
if test -f $INSTALL_DIR/lib/libmongoc-static-1.0.a; then
147+
echo "libmongoc-static-1.0.a shouldn't have been installed"
148+
exit 1
149+
fi
150+
if test -f $INSTALL_DIR/lib/libmongoc-1.0.a; then
151+
echo "libmongoc-1.0.a shouldn't have been installed"
152+
exit 1
153+
fi
154+
if test -f $INSTALL_DIR/lib/pkgconfig/libmongoc-static-1.0.pc; then
155+
echo "libmongoc-static-1.0.pc shouldn't have been installed"
156+
exit 1
157+
fi
158+
if test -f $INSTALL_DIR/lib/cmake/libmongoc-static-1.0/libmongoc-static-1.0-config.cmake; then
159+
echo "libmongoc-static-1.0-config.cmake shouldn't have been installed"
160+
exit 1
161+
fi
162+
if test -f $INSTALL_DIR/lib/cmake/libmongoc-static-1.0/libmongoc-static-1.0-config-version.cmake; then
163+
echo "libmongoc-static-1.0-config-version.cmake shouldn't have been installed"
164+
exit 1
165+
fi
163166
fi
164167

165168
cd $SRCROOT

CMakeLists.txt

Lines changed: 95 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ set (ENABLE_SASL AUTO CACHE STRING
1313
"Enable SASL authentication (Kerberos).\ Options are \"CYRUS\" to use Cyrus
1414
SASL, \"SSPI\" to use Windows Native SSPI, \"GSSAPI\" to use macOS Native GSS,
1515
\"AUTO\",\ or \"OFF\". These options are case-sensitive.")
16+
17+
set(ENABLE_STATIC AUTO CACHE STRING "Build static libmongoc. Set to ON/AUTO/OFF, default AUTO.")
1618
option(ENABLE_TESTS "Build MongoDB C Driver tests." ON)
1719
option(ENABLE_EXAMPLES "Build MongoDB C Driver examples." ON)
1820
option(ENABLE_AUTOMATIC_INIT_AND_CLEANUP "Enable automatic init and cleanup (GCC only)" ON)
@@ -46,19 +48,32 @@ find_package (libbson-1.0
4648
${BSON_ROOT_DIR}
4749
REQUIRED)
4850

49-
find_package (libbson-static-1.0
50-
"${MONGOC_MAJOR_VERSION}.${MONGOC_MINOR_VERSION}.${MONGOC_MICRO_VERSION}"
51-
HINTS
52-
${BSON_ROOT_DIR}
53-
REQUIRED)
54-
5551
message ("-- libbson found version \"${BSON_VERSION}\"")
5652
message ("-- libbson include path \"${BSON_INCLUDE_DIRS}\"")
5753
message ("-- libbson libraries \"${BSON_LIBRARIES}\"")
5854

59-
message ("-- libbson-static found version \"${BSON_STATIC_VERSION}\"")
60-
message ("-- libbson-static include path \"${BSON_STATIC_INCLUDE_DIRS}\"")
61-
message ("-- libbson-static libraries \"${BSON_STATIC_LIBRARIES}\"")
55+
if (ENABLE_STATIC STREQUAL ON OR ENABLE_STATIC STREQUAL AUTO)
56+
find_package (libbson-static-1.0
57+
"${MONGOC_MAJOR_VERSION}.${MONGOC_MINOR_VERSION}.${MONGOC_MICRO_VERSION}"
58+
HINTS
59+
${BSON_ROOT_DIR})
60+
61+
if (ENABLE_STATIC STREQUAL ON AND NOT BSON_STATIC_LIBRARY)
62+
message (FATAL_ERROR "Static libbson not found. Pass -DENABLE_STATIC=OFF")
63+
endif ()
64+
65+
if (BSON_STATIC_LIBRARY)
66+
set (MONGOC_ENABLE_STATIC ON)
67+
endif ()
68+
69+
message ("-- libbson-static found version \"${BSON_STATIC_VERSION}\"")
70+
message ("-- libbson-static include path \"${BSON_STATIC_INCLUDE_DIRS}\"")
71+
message ("-- libbson-static libraries \"${BSON_STATIC_LIBRARIES}\"")
72+
endif ()
73+
74+
if (ENABLE_TESTS AND NOT MONGOC_ENABLE_STATIC)
75+
message (FATAL_ERROR "ENABLE_TESTS requires ENABLE_STATIC")
76+
endif ()
6277

6378
if (NOT (ENABLE_SSL STREQUAL DARWIN
6479
OR ENABLE_SSL STREQUAL WINDOWS
@@ -532,10 +547,38 @@ else()
532547
message (STATUS "SASL disabled")
533548
endif()
534549

535-
add_library(mongoc_shared SHARED ${SOURCES} ${HEADERS})
536-
add_library(mongoc_static STATIC ${SOURCES} ${HEADERS})
537-
538-
set(CMAKE_CXX_VISIBILITY_PRESET hidden)
550+
if (ENABLE_SNAPPY STREQUAL "bundled")
551+
set (MONGOC_ENABLE_COMPRESSION 1)
552+
set (MONGOC_ENABLE_COMPRESSION_SNAPPY 1)
553+
include(FindSnappy)
554+
endif ()
555+
if (ENABLE_ZLIB STREQUAL "bundled")
556+
check_include_files ("unistd.h" HAVE_UNISTD_H)
557+
check_include_files ("stdarg.h" HAVE_STDARG_H)
558+
set (MONGOC_ENABLE_COMPRESSION 1)
559+
set (MONGOC_ENABLE_COMPRESSION_ZLIB 1)
560+
set (SOURCES ${SOURCES}
561+
${SOURCE_DIR}/src/zlib-1.2.11/adler32.c
562+
${SOURCE_DIR}/src/zlib-1.2.11/crc32.c
563+
${SOURCE_DIR}/src/zlib-1.2.11/deflate.c
564+
${SOURCE_DIR}/src/zlib-1.2.11/infback.c
565+
${SOURCE_DIR}/src/zlib-1.2.11/inffast.c
566+
${SOURCE_DIR}/src/zlib-1.2.11/inflate.c
567+
${SOURCE_DIR}/src/zlib-1.2.11/inftrees.c
568+
${SOURCE_DIR}/src/zlib-1.2.11/trees.c
569+
${SOURCE_DIR}/src/zlib-1.2.11/zutil.c
570+
${SOURCE_DIR}/src/zlib-1.2.11/compress.c
571+
${SOURCE_DIR}/src/zlib-1.2.11/uncompr.c
572+
${SOURCE_DIR}/src/zlib-1.2.11/gzclose.c
573+
${SOURCE_DIR}/src/zlib-1.2.11/gzlib.c
574+
${SOURCE_DIR}/src/zlib-1.2.11/gzread.c
575+
${SOURCE_DIR}/src/zlib-1.2.11/gzwrite.c
576+
)
577+
configure_file (
578+
"${SOURCE_DIR}/src/zlib-1.2.11/zconf.h.in"
579+
"${PROJECT_BINARY_DIR}/src/zlib-1.2.11/zconf.h"
580+
)
581+
endif ()
539582

540583
set(THREADS_PREFER_PTHREAD_FLAG 1)
541584
find_package (Threads REQUIRED)
@@ -548,23 +591,33 @@ if(WIN32)
548591
set (LIBS ${LIBS} ws2_32)
549592
endif()
550593

594+
add_library(mongoc_shared SHARED ${SOURCES} ${HEADERS})
595+
set_target_properties(mongoc_shared PROPERTIES CMAKE_CXX_VISIBILITY_PRESET hidden)
551596
target_link_libraries (mongoc_shared ${LIBS} ${BSON_LIBRARIES})
552597
target_include_directories (mongoc_shared PUBLIC ${BSON_INCLUDE_DIRS})
553598
target_compile_definitions (mongoc_shared PUBLIC MONGOC_COMPILATION ${BSON_DEFINITIONS})
554599

555-
target_link_libraries (mongoc_static ${LIBS} ${BSON_STATIC_LIBRARIES})
556-
target_include_directories (mongoc_static PUBLIC ${BSON_STATIC_INCLUDE_DIRS})
557-
target_compile_definitions (mongoc_static PUBLIC MONGOC_COMPILATION MONGOC_STATIC ${BSON_STATIC_DEFINITIONS})
558-
559600
# CMake wants to make different symlinks than the Autotools, see
560601
# https://cmake.org/pipermail/cmake/2007-September/016501.html
561602
# This hack sets up standard symlink, libmongoc-1.0.so -> libmongoc-1.0.0.so
562603
set_target_properties(mongoc_shared PROPERTIES VERSION 0 SOVERSION ${MONGOC_MAJOR_VERSION})
563-
set_target_properties(mongoc_static PROPERTIES VERSION ${MONGOC_VERSION})
564-
565604
set_target_properties(mongoc_shared PROPERTIES OUTPUT_NAME "mongoc-${MONGOC_API_VERSION}" PREFIX "lib")
566-
set_target_properties(mongoc_static PROPERTIES OUTPUT_NAME "mongoc-static-${MONGOC_API_VERSION}")
567605

606+
if (MONGOC_ENABLE_STATIC)
607+
add_library(mongoc_static STATIC ${SOURCES} ${HEADERS})
608+
target_link_libraries (mongoc_static ${LIBS} ${BSON_STATIC_LIBRARIES})
609+
target_include_directories (mongoc_static PUBLIC ${BSON_STATIC_INCLUDE_DIRS})
610+
target_compile_definitions (mongoc_static PUBLIC MONGOC_COMPILATION MONGOC_STATIC ${BSON_STATIC_DEFINITIONS})
611+
set_target_properties(mongoc_static PROPERTIES VERSION ${MONGOC_VERSION})
612+
set_target_properties(mongoc_static PROPERTIES OUTPUT_NAME "mongoc-static-${MONGOC_API_VERSION}")
613+
endif ()
614+
615+
if (ENABLE_SNAPPY STREQUAL "bundled")
616+
set_target_properties(mongoc_shared PROPERTIES LINKER_LANGUAGE CXX)
617+
if (MONGOC_ENABLE_STATIC)
618+
set_target_properties(mongoc_static PROPERTIES LINKER_LANGUAGE CXX)
619+
endif ()
620+
endif ()
568621
function(mongoc_add_test test use_shared)
569622
if (ENABLE_TESTS)
570623
add_executable(${test} ${ARGN})
@@ -574,9 +627,11 @@ function(mongoc_add_test test use_shared)
574627
endif()
575628
if (${use_shared})
576629
target_link_libraries(${test} mongoc_shared)
630+
target_include_directories(${test} PRIVATE ${BSON_INCLUDE_DIRS})
577631
else()
578632
target_compile_definitions(${test} PUBLIC "MONGOC_COMPILATION")
579633
target_link_libraries(${test} mongoc_static)
634+
target_include_directories(${test} PRIVATE ${BSON_STATIC_INCLUDE_DIRS})
580635
endif()
581636
if(WIN32)
582637
target_link_libraries(${test} shlwapi)
@@ -727,12 +782,21 @@ file(COPY ${SOURCE_DIR}/tests/x509gen DESTINATION ${PROJECT_BINARY_DIR}/tests)
727782
file(COPY ${SOURCE_DIR}/tests/release_files DESTINATION ${PROJECT_BINARY_DIR}/tests)
728783

729784
install(
730-
TARGETS mongoc_shared mongoc_static ${EXAMPLES}
785+
TARGETS mongoc_shared ${EXAMPLES}
731786
LIBRARY DESTINATION lib
732787
ARCHIVE DESTINATION lib
733788
RUNTIME DESTINATION bin
734789
)
735790

791+
if (MONGOC_ENABLE_STATIC)
792+
install(
793+
TARGETS mongoc_shared mongoc_static ${EXAMPLES}
794+
LIBRARY DESTINATION lib
795+
ARCHIVE DESTINATION lib
796+
RUNTIME DESTINATION bin
797+
)
798+
endif ()
799+
736800
set (MONGOC_HEADER_INSTALL_DIR "include/libmongoc-${MONGOC_API_VERSION}")
737801

738802
install(
@@ -768,15 +832,16 @@ install(
768832
FILES ${CMAKE_CURRENT_BINARY_DIR}/src/libmongoc-1.0.pc
769833
DESTINATION lib/pkgconfig
770834
)
771-
configure_file(
772-
${CMAKE_CURRENT_SOURCE_DIR}/src/libmongoc-static-1.0.pc.in
773-
${CMAKE_CURRENT_BINARY_DIR}/src/libmongoc-static-1.0.pc
774-
@ONLY)
775-
install(
776-
FILES ${CMAKE_CURRENT_BINARY_DIR}/src/libmongoc-static-1.0.pc
777-
DESTINATION lib/pkgconfig
778-
)
779-
835+
if (MONGOC_ENABLE_STATIC)
836+
configure_file(
837+
${CMAKE_CURRENT_SOURCE_DIR}/src/libmongoc-static-1.0.pc.in
838+
${CMAKE_CURRENT_BINARY_DIR}/src/libmongoc-static-1.0.pc
839+
@ONLY)
840+
install(
841+
FILES ${CMAKE_CURRENT_BINARY_DIR}/src/libmongoc-static-1.0.pc
842+
DESTINATION lib/pkgconfig
843+
)
844+
endif ()
780845
# Deprecated alias for libmongoc-1.0.pc, see CDRIVER-2086.
781846
if (MONGOC_ENABLE_SSL)
782847
configure_file(

NEWS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ mongo-c-driver 1.7.0
66
files for programs that link to libmongoc using CMake. Linking to libmongoc
77
statically or dynamically is now much more convenient. See the new tutorial
88
section "Include and link libmongoc in your C program".
9+
* New CMake option ENABLE_STATIC can be ON, OFF, or AUTO (the default)
910
* Minimum required CMake version has been increased to 3.1.
1011
* CMake remains experimental on non-Windows platforms and issues a warning now
1112
* Support for wire compression.

0 commit comments

Comments
 (0)