diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 741ade2d..7951592c 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -29,9 +29,6 @@ env:
jobs:
linux-x86_64:
runs-on: ubuntu-latest
- defaults:
- run:
- working-directory: ./src
steps:
- uses: actions/checkout@v2
- name: Install prerequisites
@@ -53,9 +50,9 @@ jobs:
-D HAVE_LINUXGPIO=1
-D HAVE_LINUXSPI=1
-D CMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
- -B ../build
+ -B build
- name: Build
- run: cmake --build ../build
+ run: cmake --build build
- name: Archive build artifacts
if: always()
uses: actions/upload-artifact@v2
@@ -70,15 +67,12 @@ jobs:
with:
name: avrdude-linux-x86_64
path: |
- build/avrdude
- build/avrdude.conf
+ build/src/avrdude
+ build/src/avrdude.conf
linux:
runs-on: ubuntu-latest
container: debian:11
- defaults:
- run:
- working-directory: ./src
strategy:
matrix:
include:
@@ -117,9 +111,9 @@ jobs:
-D CMAKE_FIND_ROOT_PATH=/usr/${{matrix.prefix}}
-D CMAKE_INCLUDE_PATH=/usr/include/${{matrix.inc-lib}}
-D CMAKE_LIBRARY_PATH=/usr/lib/${{matrix.inc-lib}}
- -B ../build
+ -B build
- name: Build
- run: cmake --build ../build
+ run: cmake --build build
- name: Archive build artifacts
if: always()
uses: actions/upload-artifact@v2
@@ -134,14 +128,11 @@ jobs:
with:
name: avrdude-linux-${{matrix.processor}}
path: |
- build/avrdude
- build/avrdude.conf
+ build/src/avrdude
+ build/src/avrdude.conf
macos-x86_64:
runs-on: macos-latest
- defaults:
- run:
- working-directory: ./src
steps:
- uses: actions/checkout@v2
- name: Install prerequisites
@@ -161,9 +152,9 @@ jobs:
-D CMAKE_EXE_LINKER_FLAGS=-L/usr/local/Cellar
-D DEBUG_CMAKE=1
-D CMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
- -B ../build
+ -B build
- name: Build
- run: cmake --build ../build
+ run: cmake --build build
- name: Archive build artifacts
if: always()
uses: actions/upload-artifact@v2
@@ -178,14 +169,11 @@ jobs:
with:
name: avrdude-macos-x86_64
path: |
- build/avrdude
- build/avrdude.conf
+ build/src/avrdude
+ build/src/avrdude.conf
msvc:
runs-on: windows-latest
- defaults:
- run:
- working-directory: ./src
strategy:
matrix:
include:
@@ -212,9 +200,9 @@ jobs:
-D CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO="/DEBUG /INCREMENTAL:NO /LTCG /OPT:REF /OPT:ICF"
-D CMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
-D USE_EXTERNAL=1
- -B ../build
+ -B build
- name: Build
- run: cmake --build ../build --config ${{env.BUILD_TYPE}}
+ run: cmake --build build --config ${{env.BUILD_TYPE}}
- name: Archive build artifacts
if: always()
uses: actions/upload-artifact@v2
@@ -226,23 +214,22 @@ jobs:
!**/*.obj
- name: Move executables
run: |
- mv ../build/RelWithDebInfo/avrdude.exe ../build
- mv ../build/RelWithDebInfo/avrdude.pdb ../build
+ mv build/src/RelWithDebInfo/avrdude.exe build/src
+ mv build/src/RelWithDebInfo/avrdude.pdb build/src
- name: Archive executables
uses: actions/upload-artifact@v2
with:
name: avrdude-msvc-${{matrix.arch}}
path: |
- build/avrdude.exe
- build/avrdude.pdb
- build/avrdude.conf
+ build/src/avrdude.exe
+ build/src/avrdude.pdb
+ build/src/avrdude.conf
mingw:
runs-on: windows-latest
defaults:
run:
shell: msys2 {0}
- working-directory: ./src
strategy:
matrix:
include:
@@ -269,9 +256,9 @@ jobs:
-G"MSYS Makefiles"
-D DEBUG_CMAKE=1
-D CMAKE_BUILD_TYPE=${{env.BUILD_TYPE}}
- -B ../build
+ -B build
- name: Build
- run: cmake --build ../build
+ run: cmake --build build
- name: Archive build artifacts
if: always()
uses: actions/upload-artifact@v2
@@ -284,5 +271,5 @@ jobs:
with:
name: avrdude-mingw-${{matrix.env}}
path: |
- build/avrdude.exe
- build/avrdude.conf
+ build/src/avrdude.exe
+ build/src/avrdude.conf
diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 00000000..bfd4ab24
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,394 @@
+#
+# CMakeLists.txt - CMake project for AVRDUDE
+# Copyright (C) 2021 Marius Greuel
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see .
+#
+
+# Typical usage:
+# cmake -B build
+# cmake --build build
+
+cmake_minimum_required(VERSION 3.12)
+project(avrdude VERSION 6.99)
+
+set(CMAKE_C_STANDARD 11)
+set(CMAKE_C_STANDARD_REQUIRED True)
+
+option(BUILD_DOC "Enable building documents" OFF)
+option(HAVE_LINUXGPIO "Enable Linux sysfs GPIO support" OFF)
+option(HAVE_LINUXSPI "Enable Linux SPI support" OFF)
+option(HAVE_PARPORT "Enable parallel port support" OFF)
+option(USE_EXTERNAL "Use external libraries from AVRDUDE GitHub repositories" OFF)
+option(USE_LIBUSBWIN32 "Prefer libusb-win32 over libusb" OFF)
+option(DEBUG_CMAKE "Enable debugging output for this CMake project" OFF)
+option(BUILD_SHARED_LIBS "Build shared libraries" OFF)
+
+include(CheckIncludeFile)
+include(CheckSymbolExists)
+include(FetchContent)
+include(FindPackageMessage)
+include(GNUInstallDirs)
+
+set(CONFIG_DIR "${CMAKE_INSTALL_FULL_SYSCONFDIR}")
+set(AVRDUDE_FULL_VERSION ${CMAKE_PROJECT_VERSION})
+
+# =====================================
+# Get Git commit info
+# =====================================
+
+# GIT_COMMIT_HASH -> hash of latest commit, e.g. b8b859f5
+# GIT_COMMIT_DATE -> date of latest commit, e.g. 20201231
+# GIT_COMMIT_YEAR -> year of latest commit, e.g. 2020
+
+find_package(Git)
+if(Git_FOUND)
+ execute_process(
+ COMMAND "${GIT_EXECUTABLE}" log -1 --format=%h
+ WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
+ OUTPUT_VARIABLE GIT_COMMIT_HASH
+ ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
+
+ execute_process(
+ COMMAND "${GIT_EXECUTABLE}" log -1 --format=%ad --date=format:%Y%m%d
+ WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
+ OUTPUT_VARIABLE GIT_COMMIT_DATE
+ ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
+
+ execute_process(
+ COMMAND "${GIT_EXECUTABLE}" log -1 --format=%ad --date=format:%Y
+ WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
+ OUTPUT_VARIABLE GIT_COMMIT_YEAR
+ ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
+
+ execute_process(
+ COMMAND "${GIT_EXECUTABLE}" log -1 --tags --format=%h
+ WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
+ OUTPUT_VARIABLE GIT_TAG_HASH
+ ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE
+ )
+
+ # If the commit is not tagged, include the date and commit hash in the full version string.
+ if(NOT GIT_COMMIT_HASH STREQUAL GIT_TAG_HASH)
+ set(AVRDUDE_FULL_VERSION "${CMAKE_PROJECT_VERSION}-${GIT_COMMIT_DATE} (${GIT_COMMIT_HASH})")
+ endif()
+endif()
+
+find_package(FLEX)
+if(NOT FLEX_FOUND)
+ message(SEND_ERROR "This CMake project requires 'flex', which is not installed on your system." )
+endif()
+
+find_package(BISON QUIET)
+if(BISON_FOUND)
+ find_package_message(BISON "Found BISON: ${BISON_EXECUTABLE} (found version \"${BISON_VERSION}\")" "[${BISON_EXECUTABLE}][${BISON_VERSION}]")
+else()
+ find_program(YACC_EXECUTABLE NAMES yacc byacc DOC "path to the yacc executable")
+ mark_as_advanced(YACC_EXECUTABLE)
+ if(YACC_EXECUTABLE)
+ find_package_message(YACC "Found YACC: ${YACC_EXECUTABLE}" "[${YACC_EXECUTABLE}]")
+ else()
+ message(SEND_ERROR "This CMake project requires 'bison', 'yacc', or 'byacc', which is not installed on your system." )
+ endif()
+endif()
+
+# =====================================
+# Detect installed libraries
+# =====================================
+
+# Prefer static libraries over DLLs on Windows
+if(WIN32)
+ set(PREFERRED_LIBELF libelf.a elf)
+ set(PREFERRED_LIBUSB libusb.a usb)
+ set(PREFERRED_LIBUSB_1_0 libusb-1.0.a usb-1.0)
+ set(PREFERRED_LIBHIDAPI libhidapi.a libhidapi-libusb.a libhidapi-hidraw.a hidapi hidapi-libusb hidapi-hidraw)
+ set(PREFERRED_LIBFTDI libftdi.a ftdi)
+ set(PREFERRED_LIBFTDI1 libftdi1.a ftdi1)
+else()
+ set(PREFERRED_LIBELF elf)
+ set(PREFERRED_LIBUSB usb)
+ set(PREFERRED_LIBUSB_1_0 usb-1.0)
+ set(PREFERRED_LIBHIDAPI hidapi hidapi-libusb hidapi-hidraw)
+ set(PREFERRED_LIBFTDI ftdi)
+ set(PREFERRED_LIBFTDI1 ftdi1)
+endif()
+
+# -------------------------------------
+# Find libelf
+
+find_library(HAVE_LIBELF NAMES ${PREFERRED_LIBELF})
+if(HAVE_LIBELF)
+ set(LIB_LIBELF ${HAVE_LIBELF})
+ check_include_file(libelf.h HAVE_LIBELF_H)
+ check_include_file(libelf/libelf.h HAVE_LIBELF_LIBELF_H)
+endif()
+
+# -------------------------------------
+# Find libusb
+
+find_library(HAVE_LIBUSB NAMES ${PREFERRED_LIBUSB})
+if(HAVE_LIBUSB)
+ set(LIB_LIBUSB ${HAVE_LIBUSB})
+endif()
+
+find_library(HAVE_LIBUSB_1_0 NAMES ${PREFERRED_LIBUSB_1_0})
+if(HAVE_LIBUSB_1_0)
+ set(LIB_LIBUSB_1_0 ${HAVE_LIBUSB_1_0})
+endif()
+
+# FreeBSD's library 'libusb' supports both the libusb-0.1 and libusb-1.0 API.
+if (HAVE_LIBUSB AND CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
+ set(HAVE_LIBUSB_1_0 ${HAVE_LIBUSB})
+endif()
+
+find_library(HAVE_LIBUSB_WIN32 NAMES libusb0.a usb0)
+
+if(HAVE_LIBUSB OR HAVE_LIBUSB_1_0 OR HAVE_LIBUSB_WIN32)
+ check_include_file(usb.h HAVE_USB_H)
+ check_include_file(lusb0_usb.h HAVE_LUSB0_USB_H)
+ check_include_file(libusb.h HAVE_LIBUSB_H)
+ check_include_file(libusb-1.0/libusb.h HAVE_LIBUSB_1_0_LIBUSB_H)
+
+ if((USE_LIBUSBWIN32 OR NOT HAVE_LIBUSB) AND HAVE_LIBUSB_WIN32)
+ set(HAVE_LIBUSB ${HAVE_LIBUSB_WIN32})
+ set(LIB_LIBUSB ${HAVE_LIBUSB_WIN32})
+ unset(HAVE_USB_H CACHE)
+ elseif(NOT HAVE_USB_H)
+ find_path(LIBUSB_COMPAT_DIR libusb-compat/usb.h)
+ if(LIBUSB_COMPAT_DIR)
+ set(LIBUSB_COMPAT_DIR ${LIBUSB_COMPAT_DIR}/libusb-compat)
+ set(HAVE_USB_H 1)
+ else()
+ unset(LIBUSB_COMPAT_DIR CACHE)
+ endif()
+ endif()
+endif()
+
+# -------------------------------------
+# Find libhidapi
+
+find_library(HAVE_LIBHID NAMES hid)
+
+find_library(HAVE_LIBHIDAPI NAMES ${PREFERRED_LIBHIDAPI})
+if(HAVE_LIBHIDAPI)
+ set(LIB_LIBHIDAPI ${HAVE_LIBHIDAPI})
+ check_include_file(hidapi/hidapi.h HAVE_HIDAPI_HIDAPI_H)
+endif()
+
+# -------------------------------------
+# Find libftdi
+
+find_library(HAVE_LIBFTDI NAMES ${PREFERRED_LIBFTDI})
+if(HAVE_LIBFTDI)
+ set(LIB_LIBFTDI ${HAVE_LIBFTDI})
+ set(HAVE_LIBFTDI_TYPE_232H 1)
+endif()
+
+find_library(HAVE_LIBFTDI1 NAMES ${PREFERRED_LIBFTDI1})
+if(HAVE_LIBFTDI1)
+ set(LIB_LIBFTDI1 ${HAVE_LIBFTDI1})
+ set(HAVE_LIBFTDI_TYPE_232H 1)
+ set(CMAKE_REQUIRED_LIBRARIES ${LIB_LIBFTDI1} ${LIB_LIBUSB} ${LIB_LIBUSB_1_0})
+ check_symbol_exists(ftdi_tcioflush "libftdi1/ftdi.h" HAVE_FTDI_TCIOFLUSH)
+endif()
+
+# -------------------------------------
+# Find libreadline
+
+find_library(HAVE_LIBREADLINE NAMES readline)
+if(HAVE_LIBREADLINE)
+ set(LIB_LIBREADLINE ${HAVE_LIBREADLINE})
+endif()
+
+# =====================================
+# Use external libraries if requested
+# =====================================
+
+if(USE_EXTERNAL)
+ FetchContent_Declare(libelf
+ GIT_REPOSITORY https://github.com/avrdudes/libelf.git
+ GIT_TAG e5a39bf19bd6598c42e09172be5a78ceec2a065c
+ )
+
+ FetchContent_Declare(libusb
+ GIT_REPOSITORY https://github.com/avrdudes/libusb.git
+ GIT_TAG 632bc25d04eff563cc00de29435b9a7ed6f4654c
+ )
+
+ FetchContent_Declare(libhidapi
+ GIT_REPOSITORY https://github.com/avrdudes/libhidapi.git
+ GIT_TAG e3700e951f762ef92871ff4fc94586e4d1c042a6
+ )
+
+ FetchContent_Declare(libftdi
+ GIT_REPOSITORY https://github.com/avrdudes/libftdi.git
+ GIT_TAG f3a54da710002a7d25a32a69e667a69ef84cc120
+ )
+
+ message(STATUS "Fetching external libraries, please wait...")
+ FetchContent_MakeAvailable(
+ libelf
+ libusb
+ libhidapi
+ libftdi
+ )
+
+ message(STATUS "Using external library 'libelf'")
+ set(LIB_LIBELF libelf)
+ set(HAVE_LIBELF 1)
+ set(HAVE_LIBELF_H 1)
+
+ message(STATUS "Using external library 'libusb'")
+ set(LIB_LIBUSB libusb)
+ set(HAVE_LIBUSB 1)
+ set(HAVE_LUSB0_USB_H 1)
+
+ message(STATUS "Using external library 'libhidapi'")
+ set(LIB_LIBHIDAPI libhidapi)
+ set(HAVE_LIBHIDAPI 1)
+ set(HAVE_HIDAPI_HIDAPI_H 1)
+
+ message(STATUS "Using external library 'libftdi'")
+ set(LIB_LIBFTDI libftdi)
+ set(HAVE_LIBFTDI 1)
+ set(HAVE_LIBFTDI_TYPE_232H 1)
+endif()
+
+add_subdirectory(src)
+
+# =====================================
+# Setup default port names
+# =====================================
+
+if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
+ set(DEFAULT_PAR_PORT "/dev/parport0")
+ set(DEFAULT_SER_PORT "/dev/ttyS0")
+elseif (CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
+ set(DEFAULT_PAR_PORT "/dev/ppi0")
+ set(DEFAULT_SER_PORT "/dev/cuad0")
+elseif (CMAKE_SYSTEM_NAME STREQUAL "Solaris")
+ set(DEFAULT_PAR_PORT "/dev/printers/0")
+ set(DEFAULT_SER_PORT "/dev/term/a")
+elseif (CMAKE_SYSTEM_NAME STREQUAL "Windows")
+ set(DEFAULT_PAR_PORT "lpt1")
+ set(DEFAULT_SER_PORT "com1")
+else()
+ set(DEFAULT_PAR_PORT "unknown")
+ set(DEFAULT_SER_PORT "unknown")
+endif()
+
+# =====================================
+# Configuration
+# =====================================
+
+message(STATUS "Configuration summary:")
+message(STATUS "----------------------")
+
+if (DEBUG_CMAKE)
+ message(STATUS "CMAKE_HOST_SYSTEM: ${CMAKE_HOST_SYSTEM}")
+ message(STATUS "CMAKE_SYSTEM: ${CMAKE_SYSTEM}")
+ message(STATUS "CMAKE_FIND_ROOT_PATH: ${CMAKE_FIND_ROOT_PATH}")
+ message(STATUS "CMAKE_C_COMPILER: ${CMAKE_C_COMPILER}")
+ message(STATUS "CONFIG_DIR: ${CONFIG_DIR}")
+ message(STATUS "AVRDUDE_FULL_VERSION: ${AVRDUDE_FULL_VERSION}")
+ message(STATUS "USE_EXTERNAL: ${USE_EXTERNAL}")
+ message(STATUS "USE_LIBUSBWIN32: ${USE_LIBUSBWIN32}")
+ message(STATUS "HAVE_LIBELF: ${HAVE_LIBELF}")
+ message(STATUS "HAVE_LIBUSB: ${HAVE_LIBUSB}")
+ message(STATUS "HAVE_LIBUSB_1_0: ${HAVE_LIBUSB_1_0}")
+ message(STATUS "HAVE_LIBUSB_WIN32: ${HAVE_LIBUSB_WIN32}")
+ message(STATUS "HAVE_LIBHID: ${HAVE_LIBHID}")
+ message(STATUS "HAVE_LIBHIDAPI: ${HAVE_LIBHIDAPI}")
+ message(STATUS "HAVE_LIBFTDI: ${HAVE_LIBFTDI}")
+ message(STATUS "HAVE_LIBFTDI1: ${HAVE_LIBFTDI1}")
+ message(STATUS "HAVE_LIBREADLINE: ${HAVE_LIBREADLINE}")
+ message(STATUS "HAVE_LIBELF_H: ${HAVE_LIBELF_H}")
+ message(STATUS "HAVE_LIBELF_LIBELF_H: ${HAVE_LIBELF_LIBELF_H}")
+ message(STATUS "HAVE_USB_H: ${HAVE_USB_H}")
+ message(STATUS "HAVE_LUSB0_USB_H: ${HAVE_LUSB0_USB_H}")
+ message(STATUS "HAVE_LIBUSB_H: ${HAVE_LIBUSB_H}")
+ message(STATUS "HAVE_LIBUSB_1_0_LIBUSB_H: ${HAVE_LIBUSB_1_0_LIBUSB_H}")
+ message(STATUS "HAVE_HIDAPI_HIDAPI_H: ${HAVE_HIDAPI_HIDAPI_H}")
+ message(STATUS "LIBUSB_COMPAT_DIR: ${LIBUSB_COMPAT_DIR}")
+ message(STATUS "----------------------")
+endif()
+
+if(HAVE_LIBELF)
+ message(STATUS "DO HAVE libelf")
+else()
+ message(STATUS "DON'T HAVE libelf")
+endif()
+
+if(HAVE_LIBUSB)
+ message(STATUS "DO HAVE libusb")
+else()
+ message(STATUS "DON'T HAVE libusb")
+endif()
+
+if(HAVE_LIBUSB_1_0)
+ message(STATUS "DO HAVE libusb_1_0")
+else()
+ message(STATUS "DON'T HAVE libusb_1_0")
+endif()
+
+if(HAVE_LIBHIDAPI)
+ message(STATUS "DO HAVE libhidapi")
+else()
+ message(STATUS "DON'T HAVE libhidapi")
+endif()
+
+if(HAVE_LIBFTDI)
+ if(HAVE_LIBFTDI1)
+ message(STATUS "DO HAVE libftdi (but prefer to use libftdi1)")
+ else()
+ message(STATUS "DO HAVE libftdi")
+ endif()
+else()
+ message(STATUS "DON'T HAVE libftdi")
+endif()
+
+if(HAVE_LIBFTDI1)
+ message(STATUS "DO HAVE libftdi1")
+else()
+ message(STATUS "DON'T HAVE libftdi1")
+endif()
+
+if(BUILD_DOC)
+ message(STATUS "ENABLED doc")
+else()
+ message(STATUS "DISABLED doc")
+endif()
+
+if(HAVE_PARPORT)
+ message(STATUS "ENABLED parport")
+else()
+ message(STATUS "DISABLED parport")
+endif()
+
+if(HAVE_LINUXGPIO)
+ message(STATUS "ENABLED linuxgpio")
+else()
+ message(STATUS "DISABLED linuxgpio")
+endif()
+
+if(HAVE_LINUXSPI)
+ message(STATUS "ENABLED linuxspi")
+else()
+ message(STATUS "DISABLED linuxspi")
+endif()
+
+message(STATUS "----------------------")
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 31a92228..b32934f5 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -16,285 +16,42 @@
# along with this program. If not, see .
#
-# Typical usage:
-# cmake -B build
-# cmake --build build
-
-cmake_minimum_required(VERSION 3.12)
-project(avrdude VERSION 6.99)
-
-set(CMAKE_C_STANDARD 11)
-set(CMAKE_C_STANDARD_REQUIRED True)
-
-option(BUILD_DOC "Enable building documents" OFF)
-option(HAVE_LINUXGPIO "Enable Linux sysfs GPIO support" OFF)
-option(HAVE_LINUXSPI "Enable Linux SPI support" OFF)
-option(HAVE_PARPORT "Enable parallel port support" OFF)
-option(USE_EXTERNAL "Use external libraries from AVRDUDE GitHub repositories" OFF)
-option(USE_LIBUSBWIN32 "Prefer libusb-win32 over libusb" OFF)
-option(DEBUG_CMAKE "Enable debugging output for this CMake project" OFF)
-option(BUILD_SHARED_LIBS "Build shared libraries" OFF)
-
-include(CheckIncludeFile)
-include(CheckSymbolExists)
-include(FetchContent)
-include(FindPackageMessage)
-include(GNUInstallDirs)
-
-set(CONFIG_DIR "${CMAKE_INSTALL_FULL_SYSCONFDIR}")
-set(AVRDUDE_FULL_VERSION ${CMAKE_PROJECT_VERSION})
-
# =====================================
-# Get Git commit info
+# Set up flex target
# =====================================
-# GIT_COMMIT_HASH -> hash of latest commit, e.g. b8b859f5
-# GIT_COMMIT_DATE -> date of latest commit, e.g. 20201231
-# GIT_COMMIT_YEAR -> year of latest commit, e.g. 2020
+FLEX_TARGET(Parser "lexer.l" "${PROJECT_BINARY_DIR}/lexer.c")
-find_package(Git)
-if(Git_FOUND)
- execute_process(
- COMMAND "${GIT_EXECUTABLE}" log -1 --format=%h
- WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
- OUTPUT_VARIABLE GIT_COMMIT_HASH
- ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE
- )
-
- execute_process(
- COMMAND "${GIT_EXECUTABLE}" log -1 --format=%ad --date=format:%Y%m%d
- WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
- OUTPUT_VARIABLE GIT_COMMIT_DATE
- ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE
- )
-
- execute_process(
- COMMAND "${GIT_EXECUTABLE}" log -1 --format=%ad --date=format:%Y
- WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
- OUTPUT_VARIABLE GIT_COMMIT_YEAR
- ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE
- )
-
- execute_process(
- COMMAND "${GIT_EXECUTABLE}" log -1 --tags --format=%h
- WORKING_DIRECTORY "${PROJECT_SOURCE_DIR}"
- OUTPUT_VARIABLE GIT_TAG_HASH
- ERROR_QUIET OUTPUT_STRIP_TRAILING_WHITESPACE
- )
-
- # If the commit is not tagged, include the date and commit hash in the full version string.
- if(NOT GIT_COMMIT_HASH STREQUAL GIT_TAG_HASH)
- set(AVRDUDE_FULL_VERSION "${CMAKE_PROJECT_VERSION}-${GIT_COMMIT_DATE} (${GIT_COMMIT_HASH})")
- endif()
+if (FLEX_VERSION VERSION_GREATER_EQUAL 2.5.9)
+ set(HAVE_YYLEX_DESTROY 1)
endif()
# =====================================
-# Detect flex and yacc/bison
+# Set up yacc/bison target
# =====================================
-find_package(FLEX)
-if(FLEX_FOUND)
- FLEX_TARGET(Parser lexer.l "${PROJECT_BINARY_DIR}/lexer.c")
-
- if (FLEX_VERSION VERSION_GREATER_EQUAL 2.5.9)
- set(HAVE_YYLEX_DESTROY 1)
- endif()
-else()
- message(SEND_ERROR "This CMake project requires 'flex', which is not installed on your system." )
-endif()
-
-find_package(BISON QUIET)
if(BISON_FOUND)
- find_package_message(BISON "Found BISON: ${BISON_EXECUTABLE} (found version \"${BISON_VERSION}\")" "[${BISON_EXECUTABLE}][${BISON_VERSION}]")
BISON_TARGET(Parser config_gram.y "${PROJECT_BINARY_DIR}/config_gram.c" DEFINES_FILE "${PROJECT_BINARY_DIR}/config_gram.h")
else()
- find_program(YACC_EXECUTABLE NAMES yacc byacc DOC "path to the yacc executable")
- mark_as_advanced(YACC_EXECUTABLE)
- if(YACC_EXECUTABLE)
- find_package_message(YACC "Found YACC: ${YACC_EXECUTABLE}" "[${YACC_EXECUTABLE}]")
- set(YACC_TARGET_outputs "${PROJECT_BINARY_DIR}/config_gram.c")
- add_custom_command(OUTPUT ${YACC_TARGET_outputs}
- COMMAND ${YACC_EXECUTABLE} -d -o ${YACC_TARGET_outputs} config_gram.y
- VERBATIM
- COMMENT "[YACC][Parser] Building parser with yacc"
- WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
- )
- set(BISON_Parser_OUTPUTS ${YACC_TARGET_outputs})
- else()
- message(SEND_ERROR "This CMake project requires 'bison', 'yacc', or 'byacc', which is not installed on your system." )
- endif()
-endif()
-
-# =====================================
-# Detect installed libraries
-# =====================================
-
-# Prefer static libraries over DLLs on Windows
-if(WIN32)
- set(PREFERRED_LIBELF libelf.a elf)
- set(PREFERRED_LIBUSB libusb.a usb)
- set(PREFERRED_LIBUSB_1_0 libusb-1.0.a usb-1.0)
- set(PREFERRED_LIBHIDAPI libhidapi.a libhidapi-libusb.a libhidapi-hidraw.a hidapi hidapi-libusb hidapi-hidraw)
- set(PREFERRED_LIBFTDI libftdi.a ftdi)
- set(PREFERRED_LIBFTDI1 libftdi1.a ftdi1)
-else()
- set(PREFERRED_LIBELF elf)
- set(PREFERRED_LIBUSB usb)
- set(PREFERRED_LIBUSB_1_0 usb-1.0)
- set(PREFERRED_LIBHIDAPI hidapi hidapi-libusb hidapi-hidraw)
- set(PREFERRED_LIBFTDI ftdi)
- set(PREFERRED_LIBFTDI1 ftdi1)
-endif()
-
-# -------------------------------------
-# Find libelf
-
-find_library(HAVE_LIBELF NAMES ${PREFERRED_LIBELF})
-if(HAVE_LIBELF)
- set(LIB_LIBELF ${HAVE_LIBELF})
- check_include_file(libelf.h HAVE_LIBELF_H)
- check_include_file(libelf/libelf.h HAVE_LIBELF_LIBELF_H)
-endif()
-
-# -------------------------------------
-# Find libusb
-
-find_library(HAVE_LIBUSB NAMES ${PREFERRED_LIBUSB})
-if(HAVE_LIBUSB)
- set(LIB_LIBUSB ${HAVE_LIBUSB})
-endif()
-
-find_library(HAVE_LIBUSB_1_0 NAMES ${PREFERRED_LIBUSB_1_0})
-if(HAVE_LIBUSB_1_0)
- set(LIB_LIBUSB_1_0 ${HAVE_LIBUSB_1_0})
-endif()
-
-# FreeBSD's library 'libusb' supports both the libusb-0.1 and libusb-1.0 API.
-if (HAVE_LIBUSB AND CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
- set(HAVE_LIBUSB_1_0 ${HAVE_LIBUSB})
-endif()
-
-find_library(HAVE_LIBUSB_WIN32 NAMES libusb0.a usb0)
-
-if(HAVE_LIBUSB OR HAVE_LIBUSB_1_0 OR HAVE_LIBUSB_WIN32)
- check_include_file(usb.h HAVE_USB_H)
- check_include_file(lusb0_usb.h HAVE_LUSB0_USB_H)
- check_include_file(libusb.h HAVE_LIBUSB_H)
- check_include_file(libusb-1.0/libusb.h HAVE_LIBUSB_1_0_LIBUSB_H)
-
- if((USE_LIBUSBWIN32 OR NOT HAVE_LIBUSB) AND HAVE_LIBUSB_WIN32)
- set(HAVE_LIBUSB ${HAVE_LIBUSB_WIN32})
- set(LIB_LIBUSB ${HAVE_LIBUSB_WIN32})
- unset(HAVE_USB_H CACHE)
- elseif(NOT HAVE_USB_H)
- find_path(LIBUSB_COMPAT_DIR libusb-compat/usb.h)
- if(LIBUSB_COMPAT_DIR)
- set(LIBUSB_COMPAT_DIR ${LIBUSB_COMPAT_DIR}/libusb-compat)
- set(HAVE_USB_H 1)
- else()
- unset(LIBUSB_COMPAT_DIR CACHE)
- endif()
- endif()
-endif()
-
-# -------------------------------------
-# Find libhidapi
-
-find_library(HAVE_LIBHID NAMES hid)
-
-find_library(HAVE_LIBHIDAPI NAMES ${PREFERRED_LIBHIDAPI})
-if(HAVE_LIBHIDAPI)
- set(LIB_LIBHIDAPI ${HAVE_LIBHIDAPI})
- check_include_file(hidapi/hidapi.h HAVE_HIDAPI_HIDAPI_H)
-endif()
-
-# -------------------------------------
-# Find libftdi
-
-find_library(HAVE_LIBFTDI NAMES ${PREFERRED_LIBFTDI})
-if(HAVE_LIBFTDI)
- set(LIB_LIBFTDI ${HAVE_LIBFTDI})
- set(HAVE_LIBFTDI_TYPE_232H 1)
-endif()
-
-find_library(HAVE_LIBFTDI1 NAMES ${PREFERRED_LIBFTDI1})
-if(HAVE_LIBFTDI1)
- set(LIB_LIBFTDI1 ${HAVE_LIBFTDI1})
- set(HAVE_LIBFTDI_TYPE_232H 1)
- set(CMAKE_REQUIRED_LIBRARIES ${LIB_LIBFTDI1} ${LIB_LIBUSB} ${LIB_LIBUSB_1_0})
- check_symbol_exists(ftdi_tcioflush "libftdi1/ftdi.h" HAVE_FTDI_TCIOFLUSH)
-endif()
-
-# -------------------------------------
-# Find libreadline
-
-find_library(HAVE_LIBREADLINE NAMES readline)
-if(HAVE_LIBREADLINE)
- set(LIB_LIBREADLINE ${HAVE_LIBREADLINE})
-endif()
-
-# =====================================
-# Use external libraries if requested
-# =====================================
-
-if(USE_EXTERNAL)
- FetchContent_Declare(libelf
- GIT_REPOSITORY https://github.com/avrdudes/libelf.git
- GIT_TAG e5a39bf19bd6598c42e09172be5a78ceec2a065c
+ set(YACC_TARGET_outputs "${PROJECT_BINARY_DIR}/config_gram.c")
+ add_custom_command(OUTPUT ${YACC_TARGET_outputs}
+ COMMAND ${YACC_EXECUTABLE} -d -o ${YACC_TARGET_outputs} config_gram.y
+ VERBATIM
+ COMMENT "[YACC][Parser] Building parser with yacc"
+ WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}
)
-
- FetchContent_Declare(libusb
- GIT_REPOSITORY https://github.com/avrdudes/libusb.git
- GIT_TAG 632bc25d04eff563cc00de29435b9a7ed6f4654c
- )
-
- FetchContent_Declare(libhidapi
- GIT_REPOSITORY https://github.com/avrdudes/libhidapi.git
- GIT_TAG e3700e951f762ef92871ff4fc94586e4d1c042a6
- )
-
- FetchContent_Declare(libftdi
- GIT_REPOSITORY https://github.com/avrdudes/libftdi.git
- GIT_TAG f3a54da710002a7d25a32a69e667a69ef84cc120
- )
-
- message(STATUS "Fetching external libraries, please wait...")
- FetchContent_MakeAvailable(
- libelf
- libusb
- libhidapi
- libftdi
- )
-
- message(STATUS "Using external library 'libelf'")
- set(LIB_LIBELF libelf)
- set(HAVE_LIBELF 1)
- set(HAVE_LIBELF_H 1)
-
- message(STATUS "Using external library 'libusb'")
- set(LIB_LIBUSB libusb)
- set(HAVE_LIBUSB 1)
- set(HAVE_LUSB0_USB_H 1)
-
- message(STATUS "Using external library 'libhidapi'")
- set(LIB_LIBHIDAPI libhidapi)
- set(HAVE_LIBHIDAPI 1)
- set(HAVE_HIDAPI_HIDAPI_H 1)
-
- message(STATUS "Using external library 'libftdi'")
- set(LIB_LIBFTDI libftdi)
- set(HAVE_LIBFTDI 1)
- set(HAVE_LIBFTDI_TYPE_232H 1)
+ set(BISON_Parser_OUTPUTS ${YACC_TARGET_outputs})
endif()
# =====================================
# Setup target specific options
# =====================================
+include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR})
add_compile_definitions(CONFIG_DIR=\"${CONFIG_DIR}\")
if(WIN32)
- set(EXTRA_WINDOWS_SOURCES "${PROJECT_BINARY_DIR}/windows.rc")
+ set(EXTRA_WINDOWS_SOURCES "${PROJECT_BINARY_DIR}/src/windows.rc")
set(EXTRA_WINDOWS_LIBRARIES setupapi ws2_32)
endif()
@@ -315,139 +72,15 @@ if(MSVC)
add_compile_options(/wd6255) # warning C6255: _alloca indicates failure by raising a stack overflow exception. Consider using _malloca instead
set(EXTRA_WINDOWS_SOURCES ${EXTRA_WINDOWS_SOURCES}
- "${PROJECT_SOURCE_DIR}/msvc/getopt.c"
- "${PROJECT_SOURCE_DIR}/msvc/gettimeofday.c"
- "${PROJECT_SOURCE_DIR}/msvc/usleep.cpp"
+ "msvc/getopt.c"
+ "msvc/gettimeofday.c"
+ "msvc/usleep.cpp"
)
set(EXTRA_WINDOWS_INCLUDES ${EXTRA_WINDOWS_INCLUDES}
- "${PROJECT_SOURCE_DIR}/msvc"
- "${PROJECT_SOURCE_DIR}/msvc/generated"
+ "msvc"
)
endif()
-# =====================================
-# Setup default port names
-# =====================================
-
-if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
- set(DEFAULT_PAR_PORT "/dev/parport0")
- set(DEFAULT_SER_PORT "/dev/ttyS0")
-elseif (CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
- set(DEFAULT_PAR_PORT "/dev/ppi0")
- set(DEFAULT_SER_PORT "/dev/cuad0")
-elseif (CMAKE_SYSTEM_NAME STREQUAL "Solaris")
- set(DEFAULT_PAR_PORT "/dev/printers/0")
- set(DEFAULT_SER_PORT "/dev/term/a")
-elseif (CMAKE_SYSTEM_NAME STREQUAL "Windows")
- set(DEFAULT_PAR_PORT "lpt1")
- set(DEFAULT_SER_PORT "com1")
-else()
- set(DEFAULT_PAR_PORT "unknown")
- set(DEFAULT_SER_PORT "unknown")
-endif()
-
-# =====================================
-# Configuration
-# =====================================
-
-message(STATUS "Configuration summary:")
-message(STATUS "----------------------")
-
-if (DEBUG_CMAKE)
- message(STATUS "CMAKE_HOST_SYSTEM: ${CMAKE_HOST_SYSTEM}")
- message(STATUS "CMAKE_SYSTEM: ${CMAKE_SYSTEM}")
- message(STATUS "CMAKE_FIND_ROOT_PATH: ${CMAKE_FIND_ROOT_PATH}")
- message(STATUS "CMAKE_C_COMPILER: ${CMAKE_C_COMPILER}")
- message(STATUS "CONFIG_DIR: ${CONFIG_DIR}")
- message(STATUS "AVRDUDE_FULL_VERSION: ${AVRDUDE_FULL_VERSION}")
- message(STATUS "USE_EXTERNAL: ${USE_EXTERNAL}")
- message(STATUS "USE_LIBUSBWIN32: ${USE_LIBUSBWIN32}")
- message(STATUS "HAVE_LIBELF: ${HAVE_LIBELF}")
- message(STATUS "HAVE_LIBUSB: ${HAVE_LIBUSB}")
- message(STATUS "HAVE_LIBUSB_1_0: ${HAVE_LIBUSB_1_0}")
- message(STATUS "HAVE_LIBUSB_WIN32: ${HAVE_LIBUSB_WIN32}")
- message(STATUS "HAVE_LIBHID: ${HAVE_LIBHID}")
- message(STATUS "HAVE_LIBHIDAPI: ${HAVE_LIBHIDAPI}")
- message(STATUS "HAVE_LIBFTDI: ${HAVE_LIBFTDI}")
- message(STATUS "HAVE_LIBFTDI1: ${HAVE_LIBFTDI1}")
- message(STATUS "HAVE_LIBREADLINE: ${HAVE_LIBREADLINE}")
- message(STATUS "HAVE_LIBELF_H: ${HAVE_LIBELF_H}")
- message(STATUS "HAVE_LIBELF_LIBELF_H: ${HAVE_LIBELF_LIBELF_H}")
- message(STATUS "HAVE_USB_H: ${HAVE_USB_H}")
- message(STATUS "HAVE_LUSB0_USB_H: ${HAVE_LUSB0_USB_H}")
- message(STATUS "HAVE_LIBUSB_H: ${HAVE_LIBUSB_H}")
- message(STATUS "HAVE_LIBUSB_1_0_LIBUSB_H: ${HAVE_LIBUSB_1_0_LIBUSB_H}")
- message(STATUS "HAVE_HIDAPI_HIDAPI_H: ${HAVE_HIDAPI_HIDAPI_H}")
- message(STATUS "LIBUSB_COMPAT_DIR: ${LIBUSB_COMPAT_DIR}")
- message(STATUS "----------------------")
-endif()
-
-if(HAVE_LIBELF)
- message(STATUS "DO HAVE libelf")
-else()
- message(STATUS "DON'T HAVE libelf")
-endif()
-
-if(HAVE_LIBUSB)
- message(STATUS "DO HAVE libusb")
-else()
- message(STATUS "DON'T HAVE libusb")
-endif()
-
-if(HAVE_LIBUSB_1_0)
- message(STATUS "DO HAVE libusb_1_0")
-else()
- message(STATUS "DON'T HAVE libusb_1_0")
-endif()
-
-if(HAVE_LIBHIDAPI)
- message(STATUS "DO HAVE libhidapi")
-else()
- message(STATUS "DON'T HAVE libhidapi")
-endif()
-
-if(HAVE_LIBFTDI)
- if(HAVE_LIBFTDI1)
- message(STATUS "DO HAVE libftdi (but prefer to use libftdi1)")
- else()
- message(STATUS "DO HAVE libftdi")
- endif()
-else()
- message(STATUS "DON'T HAVE libftdi")
-endif()
-
-if(HAVE_LIBFTDI1)
- message(STATUS "DO HAVE libftdi1")
-else()
- message(STATUS "DON'T HAVE libftdi1")
-endif()
-
-if(BUILD_DOC)
- message(STATUS "ENABLED doc")
-else()
- message(STATUS "DISABLED doc")
-endif()
-
-if(HAVE_PARPORT)
- message(STATUS "ENABLED parport")
-else()
- message(STATUS "DISABLED parport")
-endif()
-
-if(HAVE_LINUXGPIO)
- message(STATUS "ENABLED linuxgpio")
-else()
- message(STATUS "DISABLED linuxgpio")
-endif()
-
-if(HAVE_LINUXSPI)
- message(STATUS "ENABLED linuxspi")
-else()
- message(STATUS "DISABLED linuxspi")
-endif()
-
-message(STATUS "----------------------")
-
# =====================================
# Configure files
# =====================================