From f1fcdb9587028b9c7dded4f0ca0429a47e1c0669 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 8dbb58353b6373733edcf7f1f09297abcefa1c51 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 5634b678f36bf6671f76b3c4d891116b057ab9f9 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)