1cmake_minimum_required(VERSION 3.13...3.27)
2project(pioasm CXX)
3
4if (NOT CMAKE_BUILD_TYPE)
5    set(CMAKE_BUILD_TYPE Release)
6endif()
7
8set(CMAKE_CXX_STANDARD 11)
9
10if (PIOASM_GENERATE_PARSER)
11    find_package(BISON 3.4.2)
12    find_package(FLEX 2.5.13) # no idea about the version
13
14    FLEX_TARGET(pioasm_lexer lexer.ll ${CMAKE_CURRENT_SOURCE_DIR}/gen/lexer.cpp)
15    BISON_TARGET(pioasm_parser parser.yy ${CMAKE_CURRENT_SOURCE_DIR}/gen/parser.cpp COMPILE_FLAGS "-Wcounterexamples")
16    ADD_FLEX_BISON_DEPENDENCY(pioasm_lexer pioasm_parser)
17endif()
18
19add_executable(pioasm
20        main.cpp
21        pio_assembler.cpp
22        pio_disassembler.cpp
23        gen/lexer.cpp
24        gen/parser.cpp
25)
26
27target_sources(pioasm PRIVATE c_sdk_output.cpp)
28target_sources(pioasm PRIVATE python_output.cpp)
29target_sources(pioasm PRIVATE hex_output.cpp)
30target_sources(pioasm PRIVATE json_output.cpp)
31target_sources(pioasm PRIVATE ada_output.cpp)
32target_sources(pioasm PRIVATE go_output.cpp)
33target_sources(pioasm PRIVATE ${PIOASM_EXTRA_SOURCE_FILES})
34target_sources(pioasm PRIVATE pio_types.h)
35
36if ((CMAKE_CXX_COMPILER_ID STREQUAL "GNU") AND
37    (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL "7") AND
38    (CMAKE_CXX_COMPILER_VERSION VERSION_LESS "9") AND
39    (CMAKE_SYSTEM_PROCESSOR MATCHES "^arm.*$"))
40    # disable GCC ARM info notice about ABI change
41    target_compile_options(pioasm PRIVATE -Wno-psabi)
42endif()
43
44target_include_directories(pioasm PRIVATE ${CMAKE_CURRENT_LIST_DIR} ${CMAKE_CURRENT_LIST_DIR}/gen)
45
46if (MSVC OR
47    (WIN32 AND NOT MINGW AND (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")))
48    target_compile_definitions(pioasm PRIVATE YY_NO_UNISTD_H)
49endif()
50if (MSVC)
51    target_compile_options(pioasm PRIVATE "/std:c++latest")
52endif()
53
54
55# allow installing to flat dir
56include(GNUInstallDirs)
57if (PIOASM_FLAT_INSTALL)
58    set(INSTALL_CONFIGDIR pioasm)
59    set(INSTALL_BINDIR pioasm)
60else()
61    set(INSTALL_CONFIGDIR ${CMAKE_INSTALL_LIBDIR}/cmake/pioasm)
62    set(INSTALL_BINDIR ${CMAKE_INSTALL_BINDIR})
63endif()
64
65# allow `make install`
66install(TARGETS pioasm
67    EXPORT pioasm-targets
68    RUNTIME DESTINATION ${INSTALL_BINDIR}
69)
70
71#Export the targets to a script
72install(EXPORT pioasm-targets
73    FILE
74        pioasmTargets.cmake
75    DESTINATION
76        ${INSTALL_CONFIGDIR}
77)
78
79include(../../pico_sdk_version.cmake)
80set(PACKAGE_VERSION "${PICO_SDK_VERSION_MAJOR}.${PICO_SDK_VERSION_MINOR}.${PICO_SDK_VERSION_REVISION}")
81
82#Create a ConfigVersion.cmake file
83include(CMakePackageConfigHelpers)
84write_basic_package_version_file(
85    ${CMAKE_CURRENT_BINARY_DIR}/pioasmConfigVersion.cmake
86    VERSION ${PACKAGE_VERSION}
87    COMPATIBILITY ExactVersion
88    ARCH_INDEPENDENT
89)
90
91configure_package_config_file(${CMAKE_CURRENT_LIST_DIR}/cmake/pioasmConfig.cmake
92    ${CMAKE_CURRENT_BINARY_DIR}/pioasmConfig.cmake
93    INSTALL_DESTINATION ${INSTALL_CONFIGDIR}
94)
95
96#Install the config and configversion
97install(FILES
98    ${CMAKE_CURRENT_BINARY_DIR}/pioasmConfig.cmake
99    ${CMAKE_CURRENT_BINARY_DIR}/pioasmConfigVersion.cmake
100    DESTINATION ${INSTALL_CONFIGDIR}
101)
102