# Export the public API symbols with __declspec(dllexport).
target_compile_definitions(liblzma PRIVATE DLL_EXPORT)
+
+ if(NOT MSVC)
+ # Create a DEF file. The linker puts the ordinal numbers there
+ # too so the output from the linker isn't our final file.
+ target_link_options(liblzma PRIVATE
+ "-Wl,--output-def,liblzma.def.in")
+
+ # Remove the ordinal numbers from the DEF file so that
+ # no one will create an import library that links by ordinal
+ # instead of by name. We don't maintain a DEF file so the
+ # ordinal numbers aren't stable.
+ add_custom_command(TARGET liblzma POST_BUILD
+ COMMAND "${CMAKE_COMMAND}"
+ -DINPUT_FILE=liblzma.def.in
+ -DOUTPUT_FILE=liblzma.def
+ -P
+ "${CMAKE_CURRENT_SOURCE_DIR}/cmake/remove-ordinals.cmake"
+ BYPRODUCTS "liblzma.def"
+ VERBATIM)
+ endif()
else()
# Disable __declspec(dllimport) when linking against static liblzma.
target_compile_definitions(liblzma INTERFACE LZMA_API_STATIC)
--- /dev/null
+#############################################################################
+#
+# remove-ordinals.cmake
+#
+# Removes the ordinal numbers from a DEF file that has been created by
+# GNU ld or LLVM lld option --output-def (when creating a Windows DLL).
+# This should be equivalent: sed 's/ \+@ *[0-9]\+//'
+#
+# Usage:
+#
+# cmake -DINPUT_FILE=infile.def.in \
+# -DOUTPUT_FILE=outfile.def \
+# -P remove-ordinals.cmake
+#
+#############################################################################
+#
+# Author: Lasse Collin
+#
+# This file has been put into the public domain.
+# You can do whatever you want with this file.
+#
+#############################################################################
+
+file(READ "${INPUT_FILE}" STR)
+string(REGEX REPLACE " +@ *[0-9]+" "" STR "${STR}")
+file(WRITE "${OUTPUT_FILE}" "${STR}")