blob: 10320a277a64a8065856e204903712d6367e4330 [file] [log] [blame]
cmake_minimum_required(VERSION 3.9)
project("ODIN_II")
if(ODIN_DEBUG)
message("*** Compiling with Odin debug flags")
set(ODIN_EXTRA_FLAGS
"-g"
"-ggdb"
"-O0"
${ODIN_EXTRA_FLAGS}
)
endif()
if(ODIN_WARN)
message("*** Compiling with Odin with extra warning flags")
set(ODIN_REF_FLAGS
"-Wchkp" # Warn about memory access errors found by Pointer Bounds Checker
"-Wreturn-local-addr" # Warn about returning a pointer/reference to a local or temporary variable.
"-Wnonnull" # Warn about NULL being passed to argument slots marked as requiring non-NULL
)
set(ODIN_SIGN_FLAGS
"-Wsign-compare" # Warn about signed-unsigned comparisons
"-Wsign-conversion" # Warn about signedness conversion
"-Wsign-promo" # Warn when overload promotes from unsigned to signed
"-Wconversion" # Warn for implicit type conversions that may change a value
)
set(ODIN_LIMITS_FLAGS
"-Wshift-count-overflow" # Warn if shift count >= width of type
"-Wshift-count-negative" # Warn if shift count is negative
"-Wstrict-overflow" # Warn about optimizations that assume that signed overflow is undefined
"-Wtype-limits" # Warn if a comparison is always true or always false due to the limited range of the data type
)
set(ODIN_EXTRA_FLAGS
${ODIN_EXTRA_FLAGS}
${ODIN_REF_FLAGS}
${ODIN_SIGN_FLAGS}
${ODIN_LIMITS_FLAGS}
)
endif()
if(ODIN_TIDY)
set(CMAKE_CXX_CLANG_TIDY "clang-tidy;-checks=-*,readability-*")
endif()
if(ODIN_COVERAGE)
message("*** Compiling with Odin Coverage flags")
set(ODIN_EXTRA_FLAGS
"-g"
"-fprofile-arcs"
"-ftest-coverage"
${ODIN_EXTRA_FLAGS}
)
set(ODIN_EXTRA_LINK_FLAGS
"-lgcov --coverage"
)
endif()
#Flex and Bison are used to generate the parser
find_package(BISON REQUIRED)
find_package(FLEX REQUIRED)
#Find the flex and bison input files
file(GLOB_RECURSE LEXER_SOURCES SRC/*.l)
file(GLOB_RECURSE PARSER_SOURCES SRC/*.y)
#Make the flex and bison targets
flex_target(VerilogLexer ${LEXER_SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/verilog_flex.c)
bison_target(VerilogParser ${PARSER_SOURCES} ${CMAKE_CURRENT_BINARY_DIR}/verilog_bison.c COMPILE_FLAGS "--verbose")
add_flex_bison_dependency(VerilogLexer VerilogParser)
#Get the include directories for the generated headers
files_to_dirs(BISON_VerilogParser_OUTPUT_HEADER PARSER_INCLUDE_DIRS)
include(CheckCXXSymbolExists)
set(LIB_INCLUDE_DIRS "SRC/include")
#Collect the source files
file(GLOB_RECURSE EXEC_SOURCES main.cpp)
file(GLOB_RECURSE LIB_SOURCES SRC/*.cpp)
file(GLOB_RECURSE LIB_HEADERS_H ${LIB_INCLUDE_DIRS}/*.h)
file(GLOB_RECURSE LIB_HEADERS_HPP ${LIB_INCLUDE_DIRS}/*.hpp)
#Treat .c as CXX
set_source_files_properties(${FLEX_VerilogLexer_OUTPUTS} ${BISON_VerilogParser_OUTPUT_SOURCE} PROPERTIES LANGUAGE CXX)
#Suppress warnings in Flex/Bison generated files
if(FLEX_BISON_WARN_SUPPRESS_FLAGS)
set_source_files_properties(${FLEX_VerilogLexer_OUTPUTS} ${BISON_VerilogParser_OUTPUT_SOURCE}
PROPERTIES COMPILE_FLAGS ${FLEX_BISON_WARN_SUPPRESS_FLAGS})
endif()
add_definitions(-DUSING_BISON -DYYERROR_VERBOSE)
include_directories(${LIB_INCLUDE_DIRS} ${PARSER_INCLUDE_DIRS})
#Create the library
add_library(libodin_ii STATIC
${LIB_HEADERS_H}
${LIB_HEADERS_HPP}
${LIB_SOURCES}
${FLEX_VerilogLexer_OUTPUTS}
${BISON_VerilogParser_OUTPUT_SOURCE})
target_include_directories(libodin_ii PUBLIC ${LIB_INCLUDE_DIRS})
set_target_properties(libodin_ii PROPERTIES PREFIX "") #Avoid extra 'lib' prefix
target_link_libraries(libodin_ii
libvtrutil
librtlnumber
libarchfpga
libabc
libargparse
${CMAKE_DL_LIBS})
#Create the executable
add_executable(odin_II ${EXEC_SOURCES})
target_link_libraries(odin_II
libodin_ii)
#################################
# INCLUDE EXTRA ODIN FLAGS IS EXECUTED HERE
#
# include the flags one at a time in case some are not supported and report the error
#
foreach(ODIN_FLAG ${ODIN_EXTRA_FLAGS})
CHECK_CXX_COMPILER_FLAG(${ODIN_FLAG} FLAG_TEST)
if(FLAG_TEST)
message("-- Performing Test CXX_SUPPORT_FLAG${ODIN_FLAG} - Success")
target_compile_options(libodin_ii PRIVATE ${ODIN_FLAG})
target_compile_options(odin_II PRIVATE ${ODIN_FLAG})
else()
message("-- Performing Test CXX_SUPPORT_FLAG${ODIN_FLAG} - Failure")
endif()
endforeach()
#add extra link flags for odin
if(ODIN_EXTRA_LINK_FLAGS)
set_target_properties(libodin_ii PROPERTIES LINK_FLAGS ${ODIN_EXTRA_LINK_FLAGS})
set_target_properties(odin_II PROPERTIES LINK_FLAGS ${ODIN_EXTRA_LINK_FLAGS})
endif()
#Supress IPO link warnings if IPO is enabled
get_target_property(ODIN_USES_IPO odin_II INTERPROCEDURAL_OPTIMIZATION)
if (ODIN_USES_IPO)
set_target_properties(odin_II PROPERTIES LINK_FLAGS ${IPO_LINK_WARN_SUPRESS_FLAGS})
endif()
set(ODIN_COMPILE_OPTIONS_FLAGS
#GCC-like
"-Werror"
)
#add strict odin compiler flags, if set
if(VTR_COMPILE_OPTIONS STREQUAL "strict")
message(STATUS "ODIN_II: building with strict flags")
foreach(ODIN_FLAG ${ODIN_COMPILE_OPTIONS_FLAGS})
message(STATUS "\tAdding CXX flag: ${ODIN_FLAG}")
target_compile_options(libodin_ii PRIVATE ${ODIN_FLAG})
target_compile_options(odin_II PRIVATE ${ODIN_FLAG})
endforeach()
endif()
install(TARGETS odin_II libodin_ii DESTINATION bin)