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
|
--- a/cmake/FindBFD.cmake
+++ b/cmake/FindBFD.cmake
@@ -1,14 +1,46 @@
-find_path(BFD_INCLUDE_DIR bfd.h)
-find_library(BFD_LIBRARY bfd)
-#find_library(IBERTY_LIBRARY iberty)
-#find_library(Z_LIBRARY z)
-#find_library(DL_LIBRARY dl)
+# Patched to use static BFD
+
+# Backup the original value of the requested library suffixes
+set(_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})
+# Static libraries end with .a on Unix and .lib on Windows
+set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib)
+
+find_path(bfd_INCLUDE_DIR bfd.h)
+find_library(bfd_LIBRARY bfd)
include(FindPackageHandleStandardArgs)
-find_package_handle_standard_args(BFD DEFAULT_MSG BFD_INCLUDE_DIR BFD_LIBRARY)
+find_package_handle_standard_args(StaticBFD DEFAULT_MSG bfd_LIBRARY
+ bfd_INCLUDE_DIR)
+
+find_path(iberty_INCLUDE_DIR libiberty/libiberty.h)
+find_library(iberty_LIBRARY iberty)
+
+find_path(sframe_INCLUDE_DIR sframe.h)
+find_library(sframe_LIBRARY sframe)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(StaticBFD DEFAULT_MSG bfd_LIBRARY
+ bfd_INCLUDE_DIR)
+find_package_handle_standard_args(StaticIBERTY DEFAULT_MSG iberty_LIBRARY
+ iberty_INCLUDE_DIR)
+find_package_handle_standard_args(StaticSFRAME DEFAULT_MSG sframe_LIBRARY
+ sframe_INCLUDE_DIR)
+
+
+# Reset the library suffixes to the original value
+set(CMAKE_FIND_LIBRARY_SUFFIXES ${_CMAKE_FIND_LIBRARY_SUFFIXES})
+# Unset the temporary to not pollute the global namespace
+unset(_CMAKE_FIND_LIBRARY_SUFFIXES)
+
+# We found the static BFD library and then we set this target which
+# LLVM CMake uses to find the "shared" library. Then BFD gets linked
+# statically with LFortran and everything works. This is dependent
+# on LLVM's CMake. If it changes, we also have to change the handling
+# here.
+
-add_library(p::bfd INTERFACE IMPORTED)
-set_property(TARGET p::bfd PROPERTY INTERFACE_INCLUDE_DIRECTORIES
- ${BFD_INCLUDE_DIR})
-set_property(TARGET p::bfd PROPERTY INTERFACE_LINK_LIBRARIES
- ${BFD_LIBRARY})
+add_library(bfd::libbfd_shared INTERFACE IMPORTED)
+set_property(TARGET bfd::libbfd_shared PROPERTY INTERFACE_INCLUDE_DIRECTORIES
+ ${bfd_INCLUDE_DIR})
+set_property(TARGET bfd::libbfd_shared PROPERTY INTERFACE_LINK_LIBRARIES
+ ${bfd_LIBRARY} ${iberty_LIBRARY} ${sframe_LIBRARY})
--- a/src/libasr/CMakeLists.txt
+++ b/src/libasr/CMakeLists.txt
@@ -133,7 +133,7 @@
target_link_libraries(asr p::libunwind)
endif()
if (WITH_BFD)
- target_link_libraries(asr p::bfd)
+ target_link_libraries(asr bfd::libbfd_shared p::z)
endif()
if (WITH_LINK)
target_link_libraries(asr p::link)
--- a/src/lfortran/CMakeLists.txt
+++ b/src/lfortran/CMakeLists.txt
@@ -81,7 +81,7 @@
target_link_libraries(lfortran_lib p::rapidjson)
endif()
if (WITH_BFD)
- target_link_libraries(lfortran_lib p::bfd)
+ target_link_libraries(lfortran_lib bfd::libbfd_shared p::z)
endif()
if (WITH_LINK)
target_link_libraries(lfortran_lib p::link)
|