cmake_minimum_required(VERSION 3.23) project(fadec LANGUAGES C) enable_testing() # TODO: make this actually optional enable_language(CXX OPTIONAL) # Options set(FADEC_ARCHMODE "both" CACHE STRING "Support only 32-bit x86, 64-bit x86 or both") set_property(CACHE FADEC_ARCHMODE PROPERTY STRINGS both only32 only64) option(FADEC_UNDOC "Include undocumented instructions" FALSE) option(FADEC_DECODE "Include support for decoding" TRUE) option(FADEC_ENCODE "Include support for encoding" TRUE) option(FADEC_ENCODE2 "Include support for new encoding API" FALSE) set(CMAKE_C_STANDARD 11) if (MSVC) add_compile_options(/W4 -D_CRT_SECURE_NO_WARNINGS /wd4018 /wd4146 /wd4244 /wd4245 /wd4267 /wd4310) add_compile_options($<$:-Zc:preprocessor>) else() add_compile_options(-Wall -Wextra -Wpedantic -Wno-overlength-strings) endif() find_package(Python3 3.9 REQUIRED) add_library(fadec) add_library(fadec::fadec ALIAS fadec) set_target_properties(fadec PROPERTIES LINKER_LANGUAGE C ) set(GEN_ARGS "") if (NOT FADEC_ARCHMODE STREQUAL "only64") list(APPEND GEN_ARGS "--32") endif () if (NOT FADEC_ARCHMODE STREQUAL "only32") list(APPEND GEN_ARGS "--64") endif () if (FADEC_UNDOC) list(APPEND GEN_ARGS "--with-undoc") endif () file(MAKE_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/include") function(fadec_component) cmake_parse_arguments(ARG "" "NAME" "HEADERS;SOURCES" ${ARGN}) set(PRIV_INC ${CMAKE_CURRENT_BINARY_DIR}/include/fadec-${ARG_NAME}-private.inc) set(PUB_INC ${CMAKE_CURRENT_BINARY_DIR}/include/fadec-${ARG_NAME}-public.inc) add_custom_command( OUTPUT ${PRIV_INC} ${PUB_INC} COMMAND ${Python3_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/parseinstrs.py ${ARG_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/instrs.txt ${PUB_INC} ${PRIV_INC} ${GEN_ARGS} DEPENDS instrs.txt parseinstrs.py COMMENT "Building table for ${ARG_NAME}" ) list(APPEND FADEC_HEADERS ${PUB_INC}) target_sources(fadec PRIVATE ${ARG_SOURCES} PUBLIC FILE_SET HEADERS BASE_DIRS . FILES ${ARG_HEADERS} PUBLIC FILE_SET generated_public TYPE HEADERS BASE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/include FILES ${PUB_INC} PRIVATE FILE_SET generated_private TYPE HEADERS BASE_DIRS ${CMAKE_CURRENT_BINARY_DIR}/include FILES ${PRIV_INC} ) add_executable(fadec-${ARG_NAME}-test ${ARG_NAME}-test.c) target_link_libraries(fadec-${ARG_NAME}-test PRIVATE fadec) add_test(NAME ${ARG_NAME} COMMAND fadec-${ARG_NAME}-test) if (CMAKE_CXX_COMPILER AND ${ARG_NAME} STREQUAL "encode2") add_executable(fadec-${ARG_NAME}-test-cpp ${ARG_NAME}-test.cc) target_link_libraries(fadec-${ARG_NAME}-test-cpp PRIVATE fadec) add_test(NAME ${ARG_NAME}-cpp COMMAND fadec-${ARG_NAME}-test-cpp) endif() endfunction() if (FADEC_DECODE) fadec_component(NAME decode SOURCES decode.c format.c HEADERS fadec.h) endif () if (FADEC_ENCODE) fadec_component(NAME encode SOURCES encode.c HEADERS fadec-enc.h) endif () if (FADEC_ENCODE2) fadec_component(NAME encode2 SOURCES encode2.c HEADERS fadec-enc2.h) endif () install(TARGETS fadec EXPORT fadec LIBRARY ARCHIVE FILE_SET HEADERS FILE_SET generated_public)