#
# 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 .
#
# =====================================
# Set up flex target
# =====================================
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()
# =====================================
# Set up yacc/bison target
# =====================================
if(BISON_FOUND)
BISON_TARGET(Parser config_gram.y "${PROJECT_BINARY_DIR}/config_gram.c" DEFINES_FILE "${PROJECT_BINARY_DIR}/config_gram.h")
else()
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})
endif()
# =====================================
# Setup target specific options
# =====================================
include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR})
add_compile_definitions(CONFIG_DIR=\"${CONFIG_DIR}\")
set(EXTRA_WINDOWS_SOURCES)
set(EXTRA_WINDOWS_INCLUDES)
set(EXTRA_WINDOWS_RESOURCES)
set(EXTRA_WINDOWS_LIBRARIES)
if(WIN32 OR MINGW)
list(APPEND EXTRA_WINDOWS_RESOURCES "${PROJECT_BINARY_DIR}/src/windows.rc")
list(APPEND EXTRA_WINDOWS_LIBRARIES setupapi hid ws2_32)
endif()
if(MSVC)
enable_language(CXX)
add_compile_definitions(_CRT_SECURE_NO_WARNINGS=1)
add_compile_definitions(_CRT_NONSTDC_NO_WARNINGS=1)
add_compile_definitions(_WINSOCK_DEPRECATED_NO_WARNINGS=1)
add_compile_options(/W3)
add_compile_options(/wd4018) # warning C4018: signed/unsigned mismatch
add_compile_options(/wd4244) # warning C4244: conversion from '...' to '...', possible loss of data
add_compile_options(/wd4267) # warning C4267: conversion from '...' to '...', possible loss of data
list(APPEND EXTRA_WINDOWS_SOURCES
"msvc/getopt.c"
"msvc/gettimeofday.c"
"msvc/usleep.cpp"
"msvc/readline.cpp"
)
list(APPEND EXTRA_WINDOWS_INCLUDES "msvc")
else()
set(LIB_MATH m)
add_compile_options(-Wall -Wextra -Wno-unused-parameter -Wno-format-zero-length)
endif()
# =====================================
# Setup default port names
# =====================================
if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
set(DEFAULT_PAR_PORT "/dev/parport0")
set(DEFAULT_SER_PORT "/dev/ttyS0")
set(DEFAULT_SPI_PORT "/dev/spidev0.0:/dev/gpiochip0")
set(DEFAULT_LINUXGPIO_PORT "gpiochip0")
elseif (CMAKE_SYSTEM_NAME STREQUAL "FreeBSD")
set(DEFAULT_PAR_PORT "/dev/ppi0")
set(DEFAULT_SER_PORT "/dev/cuad0")
set(DEFAULT_SPI_PORT "unknown")
set(DEFAULT_LINUXGPIO_PORT "unknown")
elseif (CMAKE_SYSTEM_NAME STREQUAL "Solaris")
set(DEFAULT_PAR_PORT "/dev/printers/0")
set(DEFAULT_SER_PORT "/dev/term/a")
set(DEFAULT_SPI_PORT "unknown")
set(DEFAULT_LINUXGPIO_PORT "unknown")
elseif (CMAKE_SYSTEM_NAME STREQUAL "Windows")
set(DEFAULT_PAR_PORT "lpt1")
set(DEFAULT_SER_PORT "com1")
set(DEFAULT_SPI_PORT "unknown")
set(DEFAULT_LINUXGPIO_PORT "unknown")
else()
set(DEFAULT_PAR_PORT "unknown")
set(DEFAULT_SER_PORT "unknown")
set(DEFAULT_SPI_PORT "unknown")
set(DEFAULT_LINUXGPIO_PORT "unknown")
endif()
# =====================================
# Configure files
# =====================================
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/cmake_config.h.in"
"${CMAKE_CURRENT_BINARY_DIR}/ac_cfg.h"
)
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/avrdude.spec.in"
"${CMAKE_CURRENT_BINARY_DIR}/avrdude.spec"
)
if(WIN32 OR MINGW)
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/windows.rc.in"
"${CMAKE_CURRENT_BINARY_DIR}/windows.rc"
)
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/python/adgui.bat.in"
"${CMAKE_CURRENT_BINARY_DIR}/avrdude-gui.bat"
)
else()
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/python/adgui.sh.in"
"${CMAKE_CURRENT_BINARY_DIR}/avrdude-gui"
)
endif()
add_custom_command(
OUTPUT avrdude.conf
COMMAND ${CMAKE_COMMAND} -E copy "${CMAKE_CURRENT_SOURCE_DIR}/avrdude.conf.in" avrdude.conf.in
COMMAND ${CMAKE_COMMAND}
-D "AVRDUDE_FULL_VERSION=${AVRDUDE_FULL_VERSION}"
-D HAVE_PARPORT=$
-D HAVE_LINUXSPI=$
-D HAVE_LINUXGPIO=$
-D DEFAULT_PAR_PORT=${DEFAULT_PAR_PORT}
-D DEFAULT_SER_PORT=${DEFAULT_SER_PORT}
-D DEFAULT_SPI_PORT=${DEFAULT_SPI_PORT}
-D DEFAULT_LINUXGPIO_PORT=${DEFAULT_LINUXGPIO_PORT}
-P "${CMAKE_CURRENT_SOURCE_DIR}/configure.cmake"
DEPENDS avrdude.conf.in
VERBATIM
)
add_custom_target(conf ALL DEPENDS avrdude.conf)
# =====================================
# Project
# =====================================
set(SOURCES
${CMAKE_CURRENT_BINARY_DIR}/ac_cfg.h
arduino.h
arduino.c
avr.c
avr910.c
avr910.h
avrcache.c
avrdude.h
avrftdi.c
avrftdi.h
avrftdi_private.h
avrftdi_tpi.c
avrftdi_tpi.h
avrintel.c
libavrdude-avrintel.h
avr_opcodes.c
avrpart.c
bitbang.c
bitbang.h
buspirate.c
buspirate.h
butterfly.c
butterfly.h
ch341a.c
ch341a.h
config.c
config.h
confwin.c
crc16.c
crc16.h
disasm.c
dfu.c
dfu.h
dryrun.c
dryrun.h
dryrun_private.h
fileio.c
flip1.c
flip1.h
flip2.c
flip2.h
freebsd_ppi.h
ft245r.c
ft245r.h
jtagmkI.c
jtagmkI.h
jtagmkI_private.h
jtagmkII.c
jtagmkII.h
jtagmkII_private.h
jtag3.c
jtag3.h
jtag3_private.h
leds.c
libavrdude.h
linuxgpio.c
linuxgpio.h
linuxspi.c
linuxspi.h
linux_ppdev.h
lists.c
micronucleus.c
micronucleus.h
par.c
par.h
pgm.c
pgm_type.c
pickit2.c
pickit2.h
pickit5_lut_dw.c
pickit5_lut_isp.c
pickit5_lut_jtag.c
pickit5_lut_pdi.c
pickit5_lut_tpi.c
pickit5_lut_updi.c
pickit5_lut.h
pickit5.c
pickit5.h
pindefs.c
ppi.c
ppi.h
serbb.h
serbb_posix.c
serbb_win32.c
ser_avrdoper.c
ser_posix.c
ser_win32.c
serialadapter.c
serialupdi.c
serialupdi.h
serprog.c
serprog.h
solaris_ecpp.h
stk500.c
stk500.h
stk500_private.h
stk500v2.c
stk500v2.h
stk500v2_private.h
stk500generic.c
stk500generic.h
strutil.c
teensy.c
teensy.h
term.c
tpi.h
updi_constants.h
updi_link.c
updi_link.h
updi_nvm.c
updi_nvm.h
updi_nvm_v0.c
updi_nvm_v0.h
updi_nvm_v2.c
updi_nvm_v2.h
updi_nvm_v3.c
updi_nvm_v3.h
updi_nvm_v4.c
updi_nvm_v4.h
updi_nvm_v5.c
updi_nvm_v5.h
updi_nvm_v6.c
updi_nvm_v6.h
updi_readwrite.c
updi_readwrite.h
updi_state.c
updi_state.h
urbootlist.c
urbootlist.h
urbootautogen.c
urclock.c
urclock.h
urclock_hash.h
urclock_private.h
usbasp.c
usbasp.h
usbdevs.h
usb_hidapi.c
usb_libusb.c
usbtiny.h
usbtiny.c
update.c
wiring.h
wiring.c
xbee.h
xbee.c
${FLEX_Parser_OUTPUTS}
${BISON_Parser_OUTPUTS}
${EXTRA_WINDOWS_SOURCES}
)
add_library(libavrdude
${SOURCES}
)
set_target_properties(libavrdude PROPERTIES
PREFIX ""
PUBLIC_HEADER "libavrdude.h;libavrdude-avrintel.h"
VERSION 4.0.0
SOVERSION 4
)
target_include_directories(libavrdude
PUBLIC
"${PROJECT_SOURCE_DIR}"
"${PROJECT_BINARY_DIR}"
"${CMAKE_CURRENT_SOURCE_DIR}"
"${LIBUSB_COMPAT_DIR}"
${EXTRA_WINDOWS_INCLUDES}
)
target_link_libraries(libavrdude
PUBLIC
${LIB_MATH}
${LIB_LIBELF}
${LIB_LIBUSB}
${LIB_LIBUSB_1_0}
${LIB_LIBHID}
${LIB_LIBHIDAPI}
${LIB_LIBFTDI}
${LIB_LIBFTDI1}
${LIB_LIBREADLINE}
${LIB_LIBSERIALPORT}
${LIB_NCURSES}
${LIB_LIBGPIOD}
${EXTRA_WINDOWS_LIBRARIES}
)
add_executable(avrdude
main.c
developer_opts.c
developer_opts.h
developer_opts_private.h
whereami.c
whereami.h
${CMAKE_CURRENT_BINARY_DIR}/ac_cfg.h
${EXTRA_WINDOWS_RESOURCES}
)
target_link_libraries(avrdude PUBLIC libavrdude)
if(MINGW)
target_link_options(avrdude PRIVATE -static)
endif()
if(HAVE_SWIG)
include (UseSWIG)
swig_add_library(swig_avrdude LANGUAGE Python SOURCES libavrdude.i ${SOURCES})
target_include_directories(swig_avrdude
PUBLIC
"${Python3_INCLUDE_DIRS}"
"${PROJECT_SOURCE_DIR}"
"${PROJECT_BINARY_DIR}"
"${CMAKE_CURRENT_SOURCE_DIR}"
"${LIBUSB_COMPAT_DIR}"
${EXTRA_WINDOWS_INCLUDES}
)
target_link_libraries(swig_avrdude
PRIVATE
${LIB_MATH}
${LIB_LIBELF}
${LIB_LIBUSB}
${LIB_LIBUSB_1_0}
${LIB_LIBHID}
${LIB_LIBHIDAPI}
${LIB_LIBFTDI}
${LIB_LIBFTDI1}
${LIB_LIBREADLINE}
${LIB_LIBSERIALPORT}
${LIB_NCURSES}
${LIB_LIBGPIOD}
${Python3_LIBRARIES}
${EXTRA_WINDOWS_LIBRARIES}
)
endif()
# =====================================
# Install
# =====================================
install(TARGETS avrdude DESTINATION bin)
install(PROGRAMS "elf2tag" DESTINATION bin)
install(TARGETS libavrdude
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
PUBLIC_HEADER DESTINATION include COMPONENT dev
)
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/avrdude.conf" TYPE SYSCONF)
install(FILES "avrdude.1"
DESTINATION "${CMAKE_INSTALL_MANDIR}/man1"
)
if(HAVE_SWIG)
execute_process(COMMAND ${Python3_EXECUTABLE} -c "import site; print(site.getsitepackages()[0])"
OUTPUT_VARIABLE PYTHON_SITE_PACKAGES OUTPUT_STRIP_TRAILING_WHITESPACE)
install(TARGETS swig_avrdude DESTINATION ${PYTHON_SITE_PACKAGES})
install(FILES ${CMAKE_BINARY_DIR}/src/swig_avrdude.py DESTINATION ${PYTHON_SITE_PACKAGES})
install(DIRECTORY python/ DESTINATION ${CMAKE_INSTALL_DATADIR}/avrdude FILES_MATCHING PATTERN "*.ui")
install(DIRECTORY python/ DESTINATION ${CMAKE_INSTALL_DATADIR}/avrdude FILES_MATCHING PATTERN "*.py")
if(WIN32 OR MINGW)
install(PROGRAMS ${CMAKE_BINARY_DIR}/src/avrdude-gui.bat TYPE BIN)
else()
install(PROGRAMS ${CMAKE_BINARY_DIR}/src/avrdude-gui TYPE BIN)
endif()
endif()