-
Notifications
You must be signed in to change notification settings - Fork 26
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
2 changed files
with
131 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,109 @@ | ||
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($<$<COMPILE_LANGUAGE:CXX>:-Zc:preprocessor>) | ||
else() | ||
add_compile_options(-Wall -Wextra -Wpedantic -Wno-overlength-strings) | ||
endif() | ||
|
||
find_package(Python3 3.6 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) |