From da463d79fde3d8e84d17f8c16237de4d00f7581c Mon Sep 17 00:00:00 2001 From: Terence Noone Date: Sun, 3 Mar 2024 00:38:39 -0500 Subject: [PATCH 1/3] Use new find module for libserialport This new find module will replace the old logic used to locate a native copy of libserialport. THe old code didn't work on macOS, and was pretty messy. --- CMakeLists.txt | 10 ++--- cmake/FindLibserialport.cmake | 79 +++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 5 deletions(-) create mode 100644 cmake/FindLibserialport.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index d9da57f..bdc0e22 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,6 @@ cmake_minimum_required(VERSION 3.16) set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64" CACHE STRING "" FORCE) +list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") project(blisp C) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_C_STANDARD 11) @@ -42,11 +43,10 @@ set_target_properties(libblisp_static PROPERTIES OUTPUT_NAME "blisp") if(BLISP_USE_SYSTEM_LIBRARIES) - find_package(PkgConfig) - pkg_search_module(LIBSERIALPORT REQUIRED libserialport) - target_link_libraries(libblisp PUBLIC ${LIBSERIALPORT_LIBRARIES}) - target_link_libraries(libblisp_static PUBLIC ${LIBSERIALPORT_LIBRARIES}) - target_include_directories(libblisp_obj PUBLIC ${LIBSERIALPORT_INCLUDE_DIRS}) + find_package(Libserialport REQUIRED) + target_link_libraries(libblisp PUBLIC Libserialport::Libserialport) + target_link_libraries(libblisp_static PUBLIC Libserialport::Libserialport) + target_include_directories(libblisp_obj PUBLIC ${Libserialport_INCLUDE_DIRS}) else() if(NOT ${CMAKE_SYSTEM_NAME} STREQUAL "FreeBSD") target_sources(libblisp_obj PRIVATE diff --git a/cmake/FindLibserialport.cmake b/cmake/FindLibserialport.cmake new file mode 100644 index 0000000..827a010 --- /dev/null +++ b/cmake/FindLibserialport.cmake @@ -0,0 +1,79 @@ +# SPDX-License-Identifier: MIT + +#[=======================================================================[.rst: +FindLibserialport +------- + +Finds the sigrok serial port library (``libserialport``) + +Imported Targets +^^^^^^^^^^^^^^^^ + +This module defines the following imported targets, if found: + +``Libserialport::Libserialport`` + The serialport library + +Result Variables +^^^^^^^^^^^^^^^^ + +This module will define the following variables: + +``Libserialport_FOUND`` + True if the system has the serialport library. +``Libserialport_VERSION`` + The version of the serialport library which was found. +``Libserialport_INCLUDE_DIRS`` + Include directories needed to use ``libserialport``. +``Libserialport_LIBRARIES`` + Libraries needed to link to ``libserialport``. + +Cache Variables +^^^^^^^^^^^^^^^ + +The following cache variables may also be set: + +``Libserialport_INCLUDE_DIR`` + The directory containing ``libserialport.h``. +``Libserialport_LIBRARY`` + The path to the ``libserialport`` library. + +#]=======================================================================] + +find_package(PkgConfig) +pkg_check_modules(PC_Libserialport QUIET libserialport) + +find_path(Libserialport_INCLUDE_DIR + NAMES libserialport.h + PATHS "${PC_Libserialport_INCLUDE_DIRS}" +) +find_library(Libserialport_LIBRARY + NAMES serialport + HINTS "${PC_Libserialport_LIBRARY_DIRS}" +) + +set(Foo_VERSION ${PC_Foo_VERSION}) + +include(FindPackageHandleStandardArgs) +find_package_handle_standard_args(Libserialport + FOUND_VAR Libserialport_FOUND + REQUIRED_VARS + Libserialport_LIBRARY + Libserialport_INCLUDE_DIR + VERSION_VAR Libserialport_VERSION +) + +if(Libserialport_FOUND) + set(Libserialport_LIBRARIES ${Libserialport_LIBRARY}) + set(Libserialport_INCLUDE_DIRS ${Libserialport_INCLUDE_DIR}) + set(Libserialport_DEFINITIONS ${PC_Liberialport_CFLAGS_OTHER}) +endif() + +if(Libserialport_FOUND AND NOT TARGET Libserialport::Libserialport) + add_library(Libserialport::Libserialport UNKNOWN IMPORTED) + set_target_properties(Libserialport::Libserialport PROPERTIES + IMPORTED_LOCATION "${Libserialport_LIBRARY}" + INTERFACE_COMPILE_OPTIONS "${PC_Libserialport_CFLAGS_OTHER}" + INTERFACE_INCLUDE_DIRECTORIES "${Libserialport_INCLUDE_DIR}" + ) +endif() From cb3280072849e5593b6520c9ee8a448bda1e45bb Mon Sep 17 00:00:00 2001 From: Terence Noone Date: Sun, 3 Mar 2024 00:41:37 -0500 Subject: [PATCH 2/3] Do not build for both arm64 and x86_84 on macOS. While this might work when using bundled libraries, this breaks with system libraries as they are all compiled for arm64. Also, why would you need to compile an x86_64 version on arm64, and vise versa. --- CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index bdc0e22..4fe0ea2 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,6 +1,6 @@ cmake_minimum_required(VERSION 3.16) -set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64" CACHE STRING "" FORCE) list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake") +# set(CMAKE_OSX_ARCHITECTURES "arm64;x86_64" CACHE STRING "" FORCE) project(blisp C) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_C_STANDARD 11) From 2268e535d48e112dfff37bd6e68166243ec3da8d Mon Sep 17 00:00:00 2001 From: Terence Noone Date: Sun, 3 Mar 2024 00:44:55 -0500 Subject: [PATCH 3/3] Fix linking with argtable3 CMake interpreted `argtable3` to mean add `-largtable3` rather than to use the imported argtable3 target. This worked when using the bundled library, but broke with native libraries. --- tools/blisp/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/blisp/CMakeLists.txt b/tools/blisp/CMakeLists.txt index b271dc4..66cbb40 100644 --- a/tools/blisp/CMakeLists.txt +++ b/tools/blisp/CMakeLists.txt @@ -20,7 +20,7 @@ target_include_directories(blisp PRIVATE "${CMAKE_SOURCE_DIR}/include") target_link_libraries(blisp PRIVATE - argtable3 + argtable3::argtable3 libblisp_static file_parsers) if (WIN32)