summaryrefslogtreecommitdiff
path: root/volk/lib/CMakeLists.txt
diff options
context:
space:
mode:
Diffstat (limited to 'volk/lib/CMakeLists.txt')
-rw-r--r--volk/lib/CMakeLists.txt213
1 files changed, 135 insertions, 78 deletions
diff --git a/volk/lib/CMakeLists.txt b/volk/lib/CMakeLists.txt
index e18d13677..092c3ba0d 100644
--- a/volk/lib/CMakeLists.txt
+++ b/volk/lib/CMakeLists.txt
@@ -16,76 +16,141 @@
#
########################################################################
+# Setup the compiler name
+########################################################################
+set(COMPILER_NAME ${CMAKE_C_COMPILER_ID})
+if(MSVC) #its not set otherwise
+ set(COMPILER_NAME MSVC)
+endif()
+
+if(NOT DEFINED COMPILER_NAME)
+ message(FATAL_ERROR "COMPILER_NAME undefined. Volk build may not support this compiler.")
+endif()
+
+########################################################################
# Parse the arches xml file:
# Test each arch to see if the compiler supports the flag.
# If the test passes append the arch to the available list.
########################################################################
-#extract the arch lines from the xml file using crazy python
+#extract the compiler lines from the xml file using abusive python
+
+
+
execute_process(
COMMAND ${PYTHON_EXECUTABLE} -c
- "from xml.dom import minidom; print ';'.join(map(lambda a: '%s %s'%(a.attributes['name'].value,a.getElementsByTagName('flag')[0].firstChild.data),minidom.parse('${CMAKE_SOURCE_DIR}/gen/archs.xml').getElementsByTagName('arch')))"
- OUTPUT_VARIABLE arch_lines OUTPUT_STRIP_TRAILING_WHITESPACE
+ "from xml.dom import minidom; print ';'.join(map(lambda b: ','.join([','.join([b.attributes['name'].value,item.attributes['name'].value,item.firstChild.data]) for item in b.getElementsByTagName('remap')]), minidom.parse('${CMAKE_SOURCE_DIR}/gen/compilers.xml').getElementsByTagName('compiler')))"
+
+ OUTPUT_VARIABLE compiler_lines OUTPUT_STRIP_TRAILING_WHITESPACE
)
-#get any mutually exclusive archs so we can exclude them
-#this is really for compilers which can do both 32- and 64-bit compilations.
+foreach(thing ${compiler_lines})
+ string(REGEX REPLACE "," ";" thing_list ${thing})
+ list(FIND thing_list ${COMPILER_NAME} check_val)
+ if(NOT ("${check_val}" STREQUAL "-1"))
+ string(REGEX REPLACE "${COMPILER_NAME}," ";" filter_string ${thing})
+ endif()
+endforeach()
+
+
+#extract compiler prefixes from the xml file using abusive python
execute_process(
COMMAND ${PYTHON_EXECUTABLE} -c
- "from xml.dom import minidom; print ';'.join(map(lambda a: '%s %s'%(a.parentNode.attributes['name'].value,a.firstChild.data),minidom.parse('${CMAKE_SOURCE_DIR}/gen/archs.xml').getElementsByTagName('mutex')))"
- OUTPUT_VARIABLE mutex_lines OUTPUT_STRIP_TRAILING_WHITESPACE
+ "from xml.dom import minidom; print ';'.join(map(lambda b: ','.join([','.join([b.attributes['name'].value,item.firstChild.data]) for item in b.getElementsByTagName('prefix')]), minidom.parse('${CMAKE_SOURCE_DIR}/gen/compilers.xml').getElementsByTagName('compiler')))"
+
+ OUTPUT_VARIABLE compiler_prefixes OUTPUT_STRIP_TRAILING_WHITESPACE
)
-#This macro sets the ${arch}_flag variable,
-#and handles special cases for MSVC arch flags.
-macro(set_arch_flag name flag)
- if(MSVC AND ${name} STREQUAL "mmx")
- set(${name}_flag "/arch:SSE") #no /arch:MMX
- elseif(MSVC AND ${name} STREQUAL "sse")
- set(${name}_flag "/arch:SSE")
- elseif(MSVC AND ${name} STREQUAL "sse2")
- set(${name}_flag "/arch:SSE2")
- else()
- set(${name}_flag -${flag})
+foreach(thing ${compiler_prefixes})
+ string(REGEX REPLACE "," ";" thing_list ${thing})
+ list(FIND thing_list ${COMPILER_NAME} check_val)
+ if(NOT ("${check_val}" STREQUAL "-1"))
+ list(GET thing_list "1" prefix)
endif()
-endmacro(set_arch_flag)
+endforeach()
+
+
+
+
+#extract the arch lines from the xml file using abusive python
+execute_process(
+ COMMAND ${PYTHON_EXECUTABLE} -c
+ "from xml.dom import minidom; print ';'.join(map(lambda a: '%s %s %s %s'%(a.attributes['name'].value,a.getElementsByTagName('flag')[0].firstChild.data,a.getElementsByTagName('overrule')[0].firstChild.data,a.getElementsByTagName('overrule_val')[0].firstChild.data) if (len(a.getElementsByTagName('overrule'))) else '%s %s %s %s'%(a.attributes['name'].value,a.getElementsByTagName('flag')[0].firstChild.data,'no_overrule', 'no_overrule_val'), minidom.parse('${CMAKE_SOURCE_DIR}/gen/archs.xml').getElementsByTagName('arch')))"
+
+ OUTPUT_VARIABLE arch_lines OUTPUT_STRIP_TRAILING_WHITESPACE
+)
+
+
+
+
+#set the various overrule values (see archs.xml)
+#a lot of this is translating between automake and cmake
+if(NOT "${CROSSCOMPILE_MULTILIB}" STREQUAL "true")
+ set(MD_SUBCPU ${CMAKE_HOST_SYSTEM_PROCESSOR})
+endif()
+if(NOT "${ORC_FOUND}" STREQUAL "TRUE")
+ set(LV_HAVE_ORC "no")
+endif()
+
+
+
-macro(handle_arch name flag)
+
+macro(compiler_filter name flag)
+ set(filtered_flag ${flag})
+ foreach(thing ${filter_string})
+ string(REGEX REPLACE "," ";" flagmap ${thing})
+ list(GET flagmap "0" key)
+ list(GET flagmap "1" val)
+ string(REGEX MATCH "^${key}$" found ${flag})
+ if("${found}" STREQUAL "${key}")
+ string(REGEX REPLACE "^${key}$" "${val}" filtered_flag ${flag})
+ endif()
+ endforeach()
+ set(${name}_flag "${prefix}${filtered_flag}")
+endmacro()
+
+
+
+
+
+
+
+macro(handle_arch name flag overrule overrule_val)
+
+ #handle overrule
+ if("${${overrule}}" STREQUAL "${overrule_val}")
+ set(have_${name} FALSE)
+ message(STATUS "${name} overruled")
#handle special case for none flag
- if(${flag} STREQUAL "none")
+ elseif(${flag} STREQUAL "none")
set(have_${name} TRUE)
-
- #otherwise test the flag against the compiler
+ #otherwise test the flag(s) against the compiler
else()
include(CheckCXXCompilerFlag)
- set_arch_flag(${name} ${flag})
- CHECK_CXX_COMPILER_FLAG(${${name}_flag} have_${name})
+ string(REGEX REPLACE "," ";" flag_list ${flag})
+ set(have_${name} 1)
+ foreach(thing ${flag_list})
+ compiler_filter(${name} ${thing})
+ CHECK_CXX_COMPILER_FLAG(${${name}_flag} have_${thing})
+ if(NOT (${have_${name}} AND ("${have_${thing}}" STREQUAL "1")))
+ set(have_${name} 0)
+ endif()
+ endforeach()
endif()
if(have_${name})
list(APPEND available_arches ${name})
endif()
-endmacro(handle_arch)
-macro(remove_mutex name mutex)
- if(have_${name})
- unset(have_${mutex})
- endif()
- list(REMOVE_ITEM available_arches ${mutex})
-endmacro(remove_mutex)
+endmacro(handle_arch)
#create a list of available arches
foreach(arch_line ${arch_lines})
- separate_arguments(args UNIX_COMMAND "${arch_line}")
+ string(REPLACE " " ";" args "${arch_line}")
handle_arch(${args})
endforeach(arch_line)
-#strip out mutex archs
-foreach(mutex_line ${mutex_lines})
- separate_arguments(args UNIX_COMMAND "${mutex_line}")
- remove_mutex(${args})
-endforeach(mutex_line)
-
message(STATUS "Available arches: ${available_arches}")
########################################################################
@@ -114,10 +179,12 @@ macro(handle_machine1 name)
set(machine_flags "${machine_flags} ${${arch}_flag}")
endforeach(arch)
+ string(REGEX REPLACE "^[ \t]+" "" machine_flags "${machine_flags}")
+
if(is_match)
#this is a match, append the source and set its flags
set(machine_source ${CMAKE_CURRENT_BINARY_DIR}/volk_machine_${name}.c)
- set_source_files_properties(${machine_source} PROPERTIES COMPILE_FLAGS ${machine_flags})
+ set_source_files_properties(${machine_source} PROPERTIES COMPILE_FLAGS "${machine_flags}")
list(APPEND machine_sources ${machine_source})
list(APPEND machine_defs ${machine_def})
list(APPEND available_machines ${name})
@@ -138,7 +205,7 @@ endmacro(handle_machine)
#setup the available machines
foreach(machine_line ${machine_lines})
- separate_arguments(args UNIX_COMMAND "${machine_line}")
+ string(REPLACE " " ";" args "${machine_line}")
handle_machine(${args})
endforeach(machine_line)
@@ -168,20 +235,10 @@ file(GLOB xml_files ${CMAKE_SOURCE_DIR}/gen/*.xml)
file(GLOB py_files ${CMAKE_SOURCE_DIR}/gen/*.py)
file(GLOB h_files ${CMAKE_SOURCE_DIR}/include/volk/*.h)
-#make sure we can use -B with python (introduced in 2.6)
-execute_process(
- COMMAND ${PYTHON_EXECUTABLE} -B -c ""
- OUTPUT_QUIET ERROR_QUIET
- RESULT_VARIABLE PYTHON_HAS_DASH_B_RESULT
-)
-if(PYTHON_HAS_DASH_B_RESULT EQUAL 0)
- set(PYTHON_DASH_B "-B")
-endif()
-
add_custom_command(
OUTPUT ${volk_gen_sources}
DEPENDS ${xml_files} ${py_files} ${h_files}
- COMMAND ${PYTHON_EXECUTABLE} ${PYTHON_DASH_B}
+ COMMAND ${PYTHON_EXECUTABLE} -B
${CMAKE_SOURCE_DIR}/gen/volk_register.py
${CMAKE_BINARY_DIR}
)
@@ -189,14 +246,12 @@ add_custom_command(
########################################################################
# Handle orc support
########################################################################
-find_package(PkgConfig)
-if(PKG_CONFIG_FOUND)
-PKG_CHECK_MODULES(ORC "orc-0.4 > 0.4.11")
-endif(PKG_CONFIG_FOUND)
-find_program(ORCC_EXECUTABLE orcc)
-if(ORC_FOUND AND ORCC_EXECUTABLE)
+
+
+
+if(ORC_FOUND)
#setup orc library usage
include_directories(${ORC_INCLUDE_DIRS})
link_directories(${ORC_LIBRARY_DIRS})
@@ -225,16 +280,15 @@ endif()
########################################################################
# Setup the volk sources list and library
########################################################################
-if(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32)
- #http://gcc.gnu.org/wiki/Visibility
+if(NOT WIN32)
add_definitions(-fvisibility=hidden)
endif()
include_directories(
- ${CMAKE_BINARY_DIR}/include
${CMAKE_SOURCE_DIR}/include
- ${CMAKE_CURRENT_BINARY_DIR}
+ ${CMAKE_BINARY_DIR}/include
${CMAKE_CURRENT_SOURCE_DIR}
+ ${CMAKE_CURRENT_BINARY_DIR}
)
list(APPEND volk_sources
@@ -254,11 +308,13 @@ if(MSVC)
include_directories(${CMAKE_SOURCE_DIR}/msvc)
#compile the sources as C++ due to the lack of complex.h under MSVC
set_source_files_properties(${volk_sources} PROPERTIES LANGUAGE CXX)
-endif(MSVC)
+endif()
#create the volk runtime library
add_library(volk SHARED ${volk_sources})
-target_link_libraries(volk ${ORC_LIBRARIES})
+if(ORC_FOUND)
+ target_link_libraries(volk ${ORC_LIBRARIES})
+endif(ORC_FOUND)
set_target_properties(volk PROPERTIES SOVERSION ${LIBVER})
set_target_properties(volk PROPERTIES DEFINE_SYMBOL "volk_EXPORTS")
@@ -271,23 +327,24 @@ install(TARGETS volk
########################################################################
# Build the QA test application
########################################################################
-find_package(Boost COMPONENTS unit_test_framework)
+
if(Boost_FOUND)
-set_source_files_properties(
- ${CMAKE_CURRENT_SOURCE_DIR}/testqa.cc PROPERTIES
- COMPILE_DEFINITIONS "BOOST_TEST_DYN_LINK;BOOST_TEST_MAIN"
-)
+ set_source_files_properties(
+ ${CMAKE_CURRENT_SOURCE_DIR}/testqa.cc PROPERTIES
+ COMPILE_DEFINITIONS "BOOST_TEST_DYN_LINK;BOOST_TEST_MAIN"
+ )
-include_directories(${Boost_INCLUDE_DIRS})
-link_directories(${Boost_LIBRARY_DIRS})
+ include_directories(${Boost_INCLUDE_DIRS})
+ link_directories(${Boost_LIBRARY_DIRS})
-add_executable(test_all
- ${CMAKE_CURRENT_SOURCE_DIR}/testqa.cc
- ${CMAKE_CURRENT_SOURCE_DIR}/qa_utils.cc
-)
-target_link_libraries(test_all volk ${Boost_LIBRARIES})
-#ADD_TEST(qa_volk_test_all test_all)
+ add_executable(test_all
+ ${CMAKE_CURRENT_SOURCE_DIR}/testqa.cc
+ ${CMAKE_CURRENT_SOURCE_DIR}/qa_utils.cc
+ )
+ target_link_libraries(test_all volk ${Boost_LIBRARIES})
+ add_test(qa_volk_test_all test_all)
+
+endif(Boost_FOUND)
-endif()