2014-01-07 12:55:09 +00:00
|
|
|
# Copyright (C) 2010-2014 (see AUTHORS file for a list of contributors)
|
2012-12-24 02:33:50 +00:00
|
|
|
#
|
|
|
|
# This file is part of GNSS-SDR.
|
|
|
|
#
|
|
|
|
# GNSS-SDR is free software: you can redistribute it and/or modify
|
|
|
|
# it under the terms of the GNU General Public License as published by
|
|
|
|
# the Free Software Foundation, either version 3 of the License, or
|
|
|
|
# at your option) any later version.
|
|
|
|
#
|
|
|
|
# GNSS-SDR is distributed in the hope that it will be useful,
|
|
|
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
# GNU General Public License for more details.
|
|
|
|
#
|
|
|
|
# You should have received a copy of the GNU General Public License
|
|
|
|
# along with GNSS-SDR. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
#
|
|
|
|
|
|
|
|
########################################################################
|
|
|
|
if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})
|
2013-01-22 20:40:25 +00:00
|
|
|
message(FATAL_ERROR "Prevented in-tree build. This is bad practice. Try 'cd build && cmake ../' ")
|
2012-12-24 02:33:50 +00:00
|
|
|
endif(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})
|
|
|
|
|
|
|
|
########################################################################
|
|
|
|
# Project setup
|
|
|
|
########################################################################
|
2012-12-26 11:19:57 +00:00
|
|
|
cmake_minimum_required(VERSION 2.8)
|
2013-03-14 17:57:50 +00:00
|
|
|
project(gnss-sdr CXX C)
|
2012-12-24 02:33:50 +00:00
|
|
|
|
|
|
|
list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/Modules)
|
|
|
|
|
|
|
|
# Set the version information here
|
2014-04-10 20:05:04 +00:00
|
|
|
# Get the current working branch
|
|
|
|
execute_process(
|
|
|
|
COMMAND git rev-parse --abbrev-ref HEAD
|
|
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
|
|
OUTPUT_VARIABLE GIT_BRANCH
|
|
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
|
|
)
|
|
|
|
|
|
|
|
# Get the latest abbreviated commit hash of the working branch
|
|
|
|
execute_process(
|
|
|
|
COMMAND git log -1 --format=%h
|
|
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
|
|
OUTPUT_VARIABLE GIT_COMMIT_HASH
|
|
|
|
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
|
|
)
|
|
|
|
|
2012-12-24 02:33:50 +00:00
|
|
|
set(VERSION_INFO_MAJOR_VERSION 0)
|
2014-04-10 20:05:04 +00:00
|
|
|
set(VERSION_INFO_API_COMPAT 0)
|
|
|
|
set(VERSION_INFO_MINOR_VERSION 2.git-${GIT_BRANCH}-${GIT_COMMIT_HASH})
|
2013-01-19 17:10:57 +00:00
|
|
|
set(VERSION ${VERSION_INFO_MAJOR_VERSION}.${VERSION_INFO_API_COMPAT}.${VERSION_INFO_MINOR_VERSION})
|
2012-12-24 02:33:50 +00:00
|
|
|
|
2013-01-22 19:16:23 +00:00
|
|
|
file(RELATIVE_PATH RELATIVE_CMAKE_CALL ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR})
|
2012-12-24 02:33:50 +00:00
|
|
|
|
|
|
|
########################################################################
|
|
|
|
# Environment setup
|
|
|
|
########################################################################
|
2012-12-29 21:07:43 +00:00
|
|
|
include(ExternalProject)
|
2012-12-25 10:28:29 +00:00
|
|
|
|
2013-12-10 20:17:57 +00:00
|
|
|
# Detect 64-bits machine
|
|
|
|
if( CMAKE_SIZEOF_VOID_P EQUAL 8 )
|
|
|
|
set(ARCH_64BITS TRUE)
|
|
|
|
endif( CMAKE_SIZEOF_VOID_P EQUAL 8 )
|
|
|
|
|
2013-01-27 20:50:38 +00:00
|
|
|
set(OS_IS_MACOSX "")
|
|
|
|
set(OS_IS_LINUX "")
|
2013-12-10 20:17:57 +00:00
|
|
|
|
|
|
|
# Detect Linux Distribution
|
2013-01-19 17:10:57 +00:00
|
|
|
if(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
|
|
|
set(OperatingSystem "Linux")
|
2013-01-27 20:50:38 +00:00
|
|
|
set(OS_IS_LINUX TRUE)
|
2013-12-10 20:17:57 +00:00
|
|
|
if(ARCH_64BITS)
|
|
|
|
set(ARCH_ "(64 bits)")
|
|
|
|
else(ARCH_64BITS)
|
|
|
|
set(ARCH_ "(32 bits)")
|
|
|
|
endif(ARCH_64BITS)
|
2013-12-11 23:27:46 +00:00
|
|
|
if(EXISTS "/etc/lsb-release")
|
2013-12-10 20:17:57 +00:00
|
|
|
execute_process(COMMAND cat /etc/lsb-release
|
|
|
|
COMMAND grep DISTRIB_ID
|
|
|
|
COMMAND awk -F= "{ print $2 }"
|
|
|
|
COMMAND tr "\n" " "
|
|
|
|
COMMAND sed "s/ //"
|
|
|
|
OUTPUT_VARIABLE LINUX_DISTRIBUTION
|
|
|
|
RESULT_VARIABLE LINUX_ID_RESULT
|
|
|
|
)
|
|
|
|
execute_process(COMMAND cat /etc/lsb-release
|
|
|
|
COMMAND grep DISTRIB_RELEASE
|
|
|
|
COMMAND awk -F= "{ print $2 }"
|
|
|
|
COMMAND tr "\n" " "
|
|
|
|
COMMAND sed "s/ //"
|
|
|
|
OUTPUT_VARIABLE LINUX_VER
|
|
|
|
RESULT_VARIABLE LINUX_VER_RESULT
|
|
|
|
)
|
2013-12-11 23:27:46 +00:00
|
|
|
endif(EXISTS "/etc/lsb-release")
|
2013-12-14 14:36:33 +00:00
|
|
|
if(NOT LINUX_DISTRIBUTION)
|
|
|
|
if(EXISTS "/etc/linuxmint/info")
|
|
|
|
set(LINUX_DISTRIBUTION "LinuxMint")
|
|
|
|
execute_process(COMMAND cat /etc/linuxmint/info
|
|
|
|
COMMAND grep -m1 RELEASE
|
|
|
|
COMMAND awk -F= "{ print $2 }"
|
|
|
|
COMMAND tr "\n" " "
|
|
|
|
COMMAND sed "s/ //"
|
|
|
|
OUTPUT_VARIABLE LINUX_VER
|
|
|
|
RESULT_VARIABLE LINUX_VER_RESULT
|
|
|
|
)
|
|
|
|
endif(EXISTS "/etc/linuxmint/info")
|
|
|
|
endif(NOT LINUX_DISTRIBUTION)
|
2013-12-10 20:17:57 +00:00
|
|
|
if(NOT LINUX_DISTRIBUTION)
|
|
|
|
if(EXISTS "/etc/os-release")
|
2013-12-11 23:27:46 +00:00
|
|
|
execute_process(COMMAND cat /etc/os-release
|
2013-12-14 14:36:33 +00:00
|
|
|
COMMAND grep -m1 NAME
|
2013-12-10 20:17:57 +00:00
|
|
|
COMMAND awk -F= "{ print $2 }"
|
|
|
|
COMMAND tr "\n" " "
|
|
|
|
COMMAND sed "s/ //"
|
|
|
|
OUTPUT_VARIABLE LINUX_DISTRIBUTION
|
|
|
|
RESULT_VARIABLE LINUX_ID_RESULT
|
|
|
|
)
|
|
|
|
execute_process(COMMAND cat /etc/os-release
|
|
|
|
COMMAND grep VERSION_ID
|
|
|
|
COMMAND awk -F= "{ print $2 }"
|
|
|
|
COMMAND tr "\n" " "
|
|
|
|
COMMAND sed "s/ //"
|
|
|
|
OUTPUT_VARIABLE LINUX_VER
|
|
|
|
RESULT_VARIABLE LINUX_VER_RESULT
|
|
|
|
)
|
2013-12-14 14:36:33 +00:00
|
|
|
if(${LINUX_DISTRIBUTION} MATCHES "Debian")
|
|
|
|
set(LINUX_DISTRIBUTION "Debian")
|
|
|
|
endif(${LINUX_DISTRIBUTION} MATCHES "Debian")
|
2013-12-10 20:17:57 +00:00
|
|
|
endif(EXISTS "/etc/os-release")
|
|
|
|
endif(NOT LINUX_DISTRIBUTION)
|
|
|
|
if(NOT LINUX_DISTRIBUTION)
|
|
|
|
if(EXISTS "/etc/redhat-release")
|
|
|
|
set(LINUX_DISTRIBUTION "Red Hat")
|
|
|
|
file (READ /etc/redhat-release LINUX_VER)
|
|
|
|
endif(EXISTS "/etc/redhat-release")
|
|
|
|
endif(NOT LINUX_DISTRIBUTION)
|
|
|
|
if(NOT LINUX_DISTRIBUTION)
|
|
|
|
if(EXISTS "/etc/debian_version")
|
|
|
|
set(LINUX_DISTRIBUTION "Debian")
|
|
|
|
file (READ /etc/debian_version LINUX_VER)
|
|
|
|
endif(EXISTS "/etc/debian_version")
|
|
|
|
endif(NOT LINUX_DISTRIBUTION)
|
|
|
|
if(NOT LINUX_DISTRIBUTION)
|
|
|
|
set(LINUX_DISTRIBUTION "Generic")
|
|
|
|
set(LINUX_VER "Unknown")
|
|
|
|
endif(NOT LINUX_DISTRIBUTION)
|
2013-12-14 10:23:33 +00:00
|
|
|
message(STATUS "Configuring GNSS-SDR to be built on ${LINUX_DISTRIBUTION} GNU/Linux Release ${LINUX_VER} ${ARCH_}")
|
2013-01-19 17:10:57 +00:00
|
|
|
endif(${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
|
|
|
|
2013-12-10 20:17:57 +00:00
|
|
|
# Detect Mac OS X Version
|
2013-01-19 17:10:57 +00:00
|
|
|
if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
|
|
|
set(OperatingSystem "Mac OS X")
|
2013-01-27 20:50:38 +00:00
|
|
|
set(OS_IS_MACOSX TRUE)
|
2013-11-09 10:51:11 +00:00
|
|
|
exec_program(uname ARGS -v OUTPUT_VARIABLE DARWIN_VERSION)
|
|
|
|
string(REGEX MATCH "[0-9]+" DARWIN_VERSION ${DARWIN_VERSION})
|
|
|
|
if(${DARWIN_VERSION} MATCHES "13")
|
|
|
|
set(MACOSX_MAVERICKS TRUE)
|
2013-11-13 21:07:33 +00:00
|
|
|
set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LANGUAGE_STANDARD "c++11")
|
|
|
|
set(CMAKE_XCODE_ATTRIBUTE_CLANG_CXX_LIBRARY "libc++")
|
|
|
|
set(CMAKE_XCODE_ATTRIBUTE_GCC_VERSION="com.apple.compilers.llvm.clang.1_0")
|
2013-12-10 20:17:57 +00:00
|
|
|
message(STATUS "Configuring GNSS-SDR to be built on Mac OS X 10.9 Mavericks")
|
2013-11-09 10:51:11 +00:00
|
|
|
endif(${DARWIN_VERSION} MATCHES "13")
|
2013-12-10 20:17:57 +00:00
|
|
|
if(${DARWIN_VERSION} MATCHES "12")
|
|
|
|
message(STATUS "Configuring GNSS-SDR to be built on Mac OS X 10.8 Mountain Lion")
|
|
|
|
endif(${DARWIN_VERSION} MATCHES "12")
|
|
|
|
if(${DARWIN_VERSION} MATCHES "11")
|
|
|
|
message(STATUS "Configuring GNSS-SDR to be built on Mac OS X 10.7 Lion")
|
|
|
|
endif(${DARWIN_VERSION} MATCHES "11")
|
|
|
|
if(${DARWIN_VERSION} MATCHES "10")
|
|
|
|
message(STATUS "Configuring GNSS-SDR to be built on Mac OS X 10.6 Snow Leopard")
|
|
|
|
endif(${DARWIN_VERSION} MATCHES "10")
|
2013-01-19 17:10:57 +00:00
|
|
|
endif(${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
|
|
|
|
2013-12-10 20:17:57 +00:00
|
|
|
#select the release build type by default to get optimization flags
|
|
|
|
if(NOT CMAKE_BUILD_TYPE)
|
|
|
|
set(CMAKE_BUILD_TYPE "Release")
|
|
|
|
message(STATUS "Build type not specified: defaulting to Release.")
|
|
|
|
endif(NOT CMAKE_BUILD_TYPE)
|
|
|
|
set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE} CACHE STRING "")
|
2013-01-19 17:10:57 +00:00
|
|
|
|
2013-12-10 20:17:57 +00:00
|
|
|
# Append -O2 optimization flag for Debug builds
|
|
|
|
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O2")
|
2013-10-01 20:32:04 +00:00
|
|
|
|
2014-05-07 20:08:41 +00:00
|
|
|
################################################################################
|
|
|
|
# Checkout compiler version
|
|
|
|
################################################################################
|
|
|
|
|
|
|
|
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
|
|
|
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.7)
|
|
|
|
message(WARNING "Your GCC version is too old and could not support some C++11 features required by GNSS-SDR. GCC version must be at least 4.7")
|
|
|
|
endif(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.7)
|
|
|
|
endif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
|
2013-01-19 17:10:57 +00:00
|
|
|
|
2012-12-25 10:28:29 +00:00
|
|
|
################################################################################
|
|
|
|
# Googletest - http://code.google.com/p/googletest/
|
|
|
|
################################################################################
|
2012-12-28 15:40:03 +00:00
|
|
|
enable_testing()
|
2014-05-07 20:08:41 +00:00
|
|
|
if($ENV{GTEST_DIR})
|
|
|
|
set(GTEST_DIR $ENV{GTEST_DIR})
|
|
|
|
endif($ENV{GTEST_DIR})
|
2012-12-25 10:28:29 +00:00
|
|
|
if(GTEST_DIR)
|
2013-12-10 20:17:57 +00:00
|
|
|
message(STATUS "GTEST root folder at ${GTEST_DIR}")
|
2012-12-25 10:28:29 +00:00
|
|
|
else()
|
2013-12-10 20:17:57 +00:00
|
|
|
message (STATUS " Googletest has not been found because the environment variable ")
|
|
|
|
message (STATUS " GTEST_DIR is not defined.")
|
|
|
|
message (STATUS " Googletest will be downloaded and built automatically ")
|
|
|
|
message (STATUS " when doing 'make'. ")
|
2012-12-25 10:28:29 +00:00
|
|
|
endif(GTEST_DIR)
|
|
|
|
|
|
|
|
|
2013-07-04 13:47:40 +00:00
|
|
|
|
|
|
|
################################################################################
|
|
|
|
# Boost - http://www.boost.org
|
|
|
|
################################################################################
|
|
|
|
|
|
|
|
if(UNIX AND EXISTS "/usr/lib64")
|
2013-12-14 10:23:33 +00:00
|
|
|
list(APPEND BOOST_LIBRARYDIR "/usr/lib64") # Fedora 64-bit fix
|
2013-07-04 13:47:40 +00:00
|
|
|
endif(UNIX AND EXISTS "/usr/lib64")
|
2013-12-14 10:23:33 +00:00
|
|
|
if(GNURADIO_INSTALL_PREFIX)
|
|
|
|
if(EXISTS "${GNURADIO_INSTALL_PREFIX}/lib/libboost_thread-mt.so")
|
|
|
|
list(APPEND BOOST_LIBRARYDIR "${GNURADIO_INSTALL_PREFIX}/lib") # Boost installed by PyBOMBS
|
|
|
|
list(APPEND BOOST_INCLUDEDIR "${GNURADIO_INSTALL_PREFIX}/include") # Boost installed by PyBOMBS
|
|
|
|
endif(EXISTS "${GNURADIO_INSTALL_PREFIX}/lib/libboost_thread-mt.so")
|
|
|
|
endif(GNURADIO_INSTALL_PREFIX)
|
2013-07-04 13:47:40 +00:00
|
|
|
set(Boost_ADDITIONAL_VERSIONS
|
|
|
|
"1.42.0" "1.42" "1.43.0" "1.43" "1.44.0" "1.44"
|
|
|
|
"1.45.0" "1.45" "1.46.0" "1.46" "1.48.0" "1.48" "1.49.0" "1.49"
|
|
|
|
"1.50.0" "1.50" "1.51.0" "1.51" "1.53.0" "1.53" "1.54.0" "1.54"
|
|
|
|
"1.55.0" "1.55" "1.56.0" "1.56" "1.57.0" "1.57" "1.58.0" "1.58" "1.59.0" "1.59"
|
|
|
|
"1.60.0" "1.60" "1.61.0" "1.61" "1.62.0" "1.62" "1.63.0" "1.63" "1.64.0" "1.64"
|
|
|
|
"1.65.0" "1.65" "1.66.0" "1.66" "1.67.0" "1.67" "1.68.0" "1.68" "1.69.0" "1.69"
|
|
|
|
)
|
|
|
|
set(Boost_USE_MULTITHREAD ON)
|
|
|
|
set(Boost_USE_STATIC_LIBS OFF)
|
|
|
|
find_package(Boost COMPONENTS date_time system filesystem thread serialization REQUIRED)
|
|
|
|
if(NOT Boost_FOUND)
|
|
|
|
message(FATAL_ERROR "Fatal error: Boost (version >=1.42.0) required.")
|
|
|
|
endif(NOT Boost_FOUND)
|
|
|
|
|
|
|
|
|
2013-01-19 17:10:57 +00:00
|
|
|
################################################################################
|
2013-01-22 19:16:23 +00:00
|
|
|
# GNU Radio - http://gnuradio.org/redmine/projects/gnuradio/wiki
|
2013-01-19 17:10:57 +00:00
|
|
|
################################################################################
|
|
|
|
|
2013-12-11 23:27:46 +00:00
|
|
|
find_package(Gnuradio)
|
2013-11-13 21:07:33 +00:00
|
|
|
|
2013-12-10 20:17:57 +00:00
|
|
|
if(NOT GNURADIO_RUNTIME_FOUND)
|
2014-05-07 20:08:41 +00:00
|
|
|
message(STATUS "CMake cannot find GNU Radio >= 3.7")
|
2013-12-10 20:17:57 +00:00
|
|
|
if(OS_IS_LINUX)
|
|
|
|
message("Go to http://gnuradio.org/redmine/projects/pybombs/wiki")
|
|
|
|
message("and follow the instructions to install GNU Radio in your system.")
|
|
|
|
message(FATAL_ERROR "GNU Radio 3.7 or later is required to build gnss-sdr")
|
|
|
|
endif(OS_IS_LINUX)
|
|
|
|
if(OS_IS_MACOSX)
|
|
|
|
message("You can install it easily via Macports.")
|
|
|
|
message("Open a terminal and type:")
|
|
|
|
message("sudo port install gnuradio ")
|
|
|
|
message(FATAL_ERROR "GNU Radio 3.7 or later is required to build gnss-sdr")
|
|
|
|
endif(OS_IS_MACOSX)
|
|
|
|
endif(NOT GNURADIO_RUNTIME_FOUND)
|
|
|
|
|
2013-12-11 23:27:46 +00:00
|
|
|
find_package(Volk)
|
|
|
|
find_package(UHD)
|
|
|
|
|
2013-07-06 02:15:09 +00:00
|
|
|
if(NOT GNURADIO_BLOCKS_FOUND)
|
2013-12-10 20:17:57 +00:00
|
|
|
message(FATAL_ERROR "*** gnuradio-blocks 3.7 or later is required to build gnss-sdr")
|
2013-07-06 02:15:09 +00:00
|
|
|
endif()
|
|
|
|
if(NOT UHD_FOUND)
|
2013-12-11 23:27:46 +00:00
|
|
|
message(FATAL_ERROR "*** UHD is required to build gnss-sdr. Please check http://code.ettus.com/redmine/ettus/projects/uhd/wiki")
|
2013-07-06 02:15:09 +00:00
|
|
|
endif()
|
|
|
|
if(NOT GNURADIO_UHD_FOUND)
|
2013-12-10 20:17:57 +00:00
|
|
|
message(FATAL_ERROR "*** gnuradio-uhd 3.7 or later is required to build gnss-sdr")
|
2013-07-06 02:15:09 +00:00
|
|
|
endif()
|
|
|
|
if(NOT GNURADIO_FILTER_FOUND)
|
2013-12-10 20:17:57 +00:00
|
|
|
message(FATAL_ERROR "*** gnuradio-filter 3.7 or later is required to build gnss-sdr")
|
2013-07-06 02:15:09 +00:00
|
|
|
endif()
|
|
|
|
if(NOT GNURADIO_FFT_FOUND)
|
2013-12-10 20:17:57 +00:00
|
|
|
message(FATAL_ERROR "*** gnuradio-fft 3.7 or later is required to build gnss-sdr")
|
2013-07-06 02:15:09 +00:00
|
|
|
endif()
|
|
|
|
if(NOT VOLK_FOUND)
|
2013-12-10 20:17:57 +00:00
|
|
|
message(FATAL_ERROR "*** VOLK is required to build gnss-sdr")
|
2013-11-13 21:07:33 +00:00
|
|
|
endif()
|
|
|
|
if(NOT GNURADIO_ANALOG_FOUND)
|
2013-12-10 20:17:57 +00:00
|
|
|
message(FATAL_ERROR "*** gnuradio-analog 3.7 or later is required to build gnss-sdr")
|
2013-11-13 21:07:33 +00:00
|
|
|
endif()
|
|
|
|
if(NOT GNURADIO_FEC_FOUND)
|
2013-12-10 20:17:57 +00:00
|
|
|
message(FATAL_ERROR "*** gnuradio-fec 3.7 or later is required to build gnss-sdr")
|
2013-11-13 21:07:33 +00:00
|
|
|
endif()
|
|
|
|
if(NOT GNURADIO_TRELLIS_FOUND)
|
2013-12-10 20:17:57 +00:00
|
|
|
message(FATAL_ERROR "*** gnuradio-trellis 3.7 or later is required to build gnss-sdr")
|
2013-07-06 02:15:09 +00:00
|
|
|
endif()
|
2013-01-01 11:24:42 +00:00
|
|
|
|
|
|
|
|
2013-11-13 21:07:33 +00:00
|
|
|
|
2013-01-01 11:24:42 +00:00
|
|
|
################################################################################
|
|
|
|
# gflags - http://code.google.com/p/gflags/
|
|
|
|
################################################################################
|
2013-07-04 13:47:40 +00:00
|
|
|
set(LOCAL_GFLAGS false CACHE STRING "GFlags installed on the system")
|
2013-07-06 02:47:50 +00:00
|
|
|
set(GFlags_ROOT_DIR false)
|
2013-01-01 11:24:42 +00:00
|
|
|
find_package(GFlags)
|
|
|
|
|
2013-12-20 03:02:47 +00:00
|
|
|
if (NOT GFlags_FOUND OR LOCAL_GLOG)
|
2013-12-20 00:11:14 +00:00
|
|
|
message (STATUS " gflags library has not been found.")
|
|
|
|
message (STATUS " gflags will be downloaded and built automatically ")
|
|
|
|
message (STATUS " when doing 'make'. ")
|
2013-01-01 11:24:42 +00:00
|
|
|
set(gflags_RELEASE 2.0 CACHE STRING "Local gflags release")
|
|
|
|
set(gflags_MD5 "5fd4554d2ba84bf222a2fec0870d28df")
|
2013-07-04 13:47:40 +00:00
|
|
|
|
2013-01-01 11:24:42 +00:00
|
|
|
ExternalProject_Add(
|
|
|
|
gflags-${gflags_RELEASE}
|
2013-01-11 14:13:07 +00:00
|
|
|
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/gflags-${gflags_RELEASE}
|
2013-01-01 11:24:42 +00:00
|
|
|
URL http://gflags.googlecode.com/files/gflags-${gflags_RELEASE}.zip
|
|
|
|
DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR}/download/gflags-${gflags_RELEASE}
|
|
|
|
URL_MD5 ${gflags_MD5}
|
|
|
|
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/gflags/gflags-${gflags_RELEASE}
|
|
|
|
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/gflags-${gflags_RELEASE}
|
|
|
|
CONFIGURE_COMMAND <SOURCE_DIR>/configure --prefix=${CMAKE_CURRENT_BINARY_DIR}/gflags-${gflags_RELEASE}
|
|
|
|
BUILD_COMMAND make
|
|
|
|
UPDATE_COMMAND ""
|
|
|
|
PATCH_COMMAND ""
|
|
|
|
INSTALL_COMMAND ""
|
|
|
|
)
|
|
|
|
|
|
|
|
set(GFlags_INCLUDE_DIRS
|
|
|
|
${CMAKE_CURRENT_BINARY_DIR}/gflags-${gflags_RELEASE}/src CACHE PATH "Local Gflags headers"
|
|
|
|
)
|
2013-12-20 03:02:47 +00:00
|
|
|
|
|
|
|
add_library(gflags UNKNOWN IMPORTED)
|
|
|
|
set_property(TARGET gflags PROPERTY IMPORTED_LOCATION ${CMAKE_CURRENT_BINARY_DIR}/gflags-${gflags_RELEASE}/.libs/${CMAKE_FIND_LIBRARY_PREFIXES}gflags.a)
|
|
|
|
add_dependencies(gflags gflags-${gflags_RELEASE})
|
|
|
|
set(GFlags_LIBS gflags)
|
2013-07-06 02:47:50 +00:00
|
|
|
set(GFlags_ROOT_DIR ${CMAKE_CURRENT_BINARY_DIR}/gflags-${gflags_RELEASE} CACHE PATH "GFlags root folder" FORCE)
|
2013-01-23 19:32:20 +00:00
|
|
|
file(GLOB GFlags_SHARED_LIBS "${CMAKE_CURRENT_BINARY_DIR}/gflags-${gflags_RELEASE}/.libs/${CMAKE_FIND_LIBRARY_PREFIXES}gflags${CMAKE_SHARED_LIBRARY_SUFFIX}*")
|
2013-01-01 11:24:42 +00:00
|
|
|
set(GFlags_LIBRARY gflags-${gflags_RELEASE})
|
2013-12-20 03:02:47 +00:00
|
|
|
set(GFlags_LIBRARY_PATH ${CMAKE_CURRENT_BINARY_DIR}/gflags-${gflags_RELEASE}/.libs )
|
2013-01-01 11:24:42 +00:00
|
|
|
link_directories(${GFlags_LIBRARY_PATH})
|
2013-12-20 03:02:47 +00:00
|
|
|
set(GFlags_lib ${GFlags_LIBS} CACHE FILEPATH "Local Gflags library")
|
2013-01-01 11:24:42 +00:00
|
|
|
set(GFlags_LIBRARY_PATH ${GFlags_LIBS})
|
2013-12-20 03:02:47 +00:00
|
|
|
set(LOCAL_GFLAGS true CACHE STRING "GFlags downloaded and built automatically" FORCE)
|
|
|
|
endif(NOT GFlags_FOUND OR LOCAL_GLOG)
|
2013-01-01 11:24:42 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
2012-12-24 02:33:50 +00:00
|
|
|
################################################################################
|
2012-12-27 21:11:50 +00:00
|
|
|
# glog - http://code.google.com/p/google-glog/
|
2012-12-24 02:33:50 +00:00
|
|
|
################################################################################
|
|
|
|
|
2012-12-29 21:07:43 +00:00
|
|
|
find_package(GLOG)
|
2013-01-01 11:24:42 +00:00
|
|
|
if (NOT GLOG_FOUND OR LOCAL_GFLAGS)
|
2013-12-20 00:11:14 +00:00
|
|
|
message (STATUS " glog library has not been found")
|
2013-07-04 13:47:40 +00:00
|
|
|
if(NOT GFlags_FOUND)
|
2013-12-20 00:11:14 +00:00
|
|
|
message(STATUS " or it is likely not linked to gflags.")
|
2013-07-04 13:47:40 +00:00
|
|
|
endif(NOT GFlags_FOUND)
|
2013-12-20 00:11:14 +00:00
|
|
|
message (STATUS " glog will be downloaded and built automatically ")
|
|
|
|
message (STATUS " when doing 'make'. ")
|
2013-02-01 17:47:01 +00:00
|
|
|
set(glog_RELEASE 0.3.3)
|
|
|
|
set(glog_MD5 "a6fd2c22f8996846e34c763422717c18")
|
2013-07-04 13:47:40 +00:00
|
|
|
if(LOCAL_GFLAGS)
|
2013-01-01 11:24:42 +00:00
|
|
|
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE}/tmp/configure_with_gflags
|
|
|
|
"#!/bin/sh
|
|
|
|
export CPPFLAGS=-I${GFlags_INCLUDE_DIRS}
|
|
|
|
export LDFLAGS=-L${CMAKE_CURRENT_BINARY_DIR}/gflags-${gflags_RELEASE}/.libs
|
2013-01-11 14:13:07 +00:00
|
|
|
export LIBS=${GFlags_SHARED_LIBS}
|
|
|
|
../../thirdparty/glog/glog-${glog_RELEASE}/configure")
|
2013-01-01 11:24:42 +00:00
|
|
|
file(COPY ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE}/tmp/configure_with_gflags
|
|
|
|
DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE}
|
|
|
|
FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ
|
|
|
|
GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
|
|
|
|
else(LOCAL_GFLAGS)
|
2013-07-04 13:47:40 +00:00
|
|
|
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE}/tmp/configure_with_gflags
|
|
|
|
"#!/bin/sh
|
|
|
|
export CPPFLAGS=-I${GFlags_INCLUDE_DIRS}
|
|
|
|
export LDFLAGS=-L${GFlags_LIBRARY_DIRS}
|
|
|
|
export LIBS=${GFlags_LIBS}
|
|
|
|
../../thirdparty/glog/glog-${glog_RELEASE}/configure")
|
|
|
|
file(COPY ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE}/tmp/configure_with_gflags
|
|
|
|
DESTINATION ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE}
|
|
|
|
FILE_PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ
|
|
|
|
GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
|
2013-01-01 11:24:42 +00:00
|
|
|
endif(LOCAL_GFLAGS)
|
2013-07-04 13:47:40 +00:00
|
|
|
|
|
|
|
set(GLOG_CONFIGURE ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE}/configure_with_gflags)
|
2012-12-29 21:07:43 +00:00
|
|
|
ExternalProject_Add(
|
|
|
|
glog-${glog_RELEASE}
|
2013-12-20 00:11:14 +00:00
|
|
|
DEPENDS gflags-${gflags_RELEASE}
|
2013-01-11 14:13:07 +00:00
|
|
|
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE}
|
2012-12-29 21:07:43 +00:00
|
|
|
URL http://google-glog.googlecode.com/files/glog-${glog_RELEASE}.tar.gz
|
|
|
|
DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR}/download/glog-${glog_RELEASE}
|
|
|
|
URL_MD5 ${glog_MD5}
|
|
|
|
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/glog/glog-${glog_RELEASE}
|
|
|
|
BINARY_DIR ${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE}
|
2013-07-04 13:47:40 +00:00
|
|
|
CONFIGURE_COMMAND ${GLOG_CONFIGURE} --prefix=<INSTALL_DIR>
|
2012-12-29 21:07:43 +00:00
|
|
|
BUILD_COMMAND make
|
|
|
|
UPDATE_COMMAND ""
|
|
|
|
PATCH_COMMAND ""
|
|
|
|
INSTALL_COMMAND ""
|
|
|
|
)
|
|
|
|
# Set up variables
|
|
|
|
set(GLOG_INCLUDE_DIRS
|
|
|
|
${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/glog/glog-${glog_RELEASE}/src/
|
|
|
|
${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE}/src
|
|
|
|
)
|
|
|
|
set(GLOG_LIBRARIES
|
2013-01-01 11:24:42 +00:00
|
|
|
${CMAKE_CURRENT_BINARY_DIR}/glog-${glog_RELEASE}/.libs/${CMAKE_FIND_LIBRARY_PREFIXES}glog.a
|
2012-12-29 21:07:43 +00:00
|
|
|
)
|
2013-12-20 03:02:47 +00:00
|
|
|
set(LOCAL_GLOG true CACHE STRING "Glog downloaded and built automatically" FORCE)
|
2013-01-01 11:24:42 +00:00
|
|
|
endif(NOT GLOG_FOUND OR LOCAL_GFLAGS)
|
2012-12-24 02:33:50 +00:00
|
|
|
|
2013-01-11 14:13:07 +00:00
|
|
|
|
|
|
|
|
2012-12-24 02:33:50 +00:00
|
|
|
################################################################################
|
|
|
|
# GPerftools - http://code.google.com/p/gperftools/
|
|
|
|
################################################################################
|
|
|
|
|
2012-12-24 10:21:31 +00:00
|
|
|
set(GCC_GPERFTOOLS_FLAGS "")
|
2012-12-24 02:33:50 +00:00
|
|
|
find_package(Gperftools)
|
2012-12-24 10:21:31 +00:00
|
|
|
if ( NOT GPERFTOOLS_FOUND )
|
2014-05-11 12:50:57 +00:00
|
|
|
message(STATUS "The optional library GPerftools has not been found.")
|
2013-07-04 13:47:40 +00:00
|
|
|
else( NOT GPERFTOOLS_FOUND )
|
2014-05-11 12:50:57 +00:00
|
|
|
message (STATUS "GPerftools library found." )
|
|
|
|
link_libraries(${GPERFTOOLS_PROFILER} ${GPERFTOOLS_TCMALLOC})
|
2012-12-24 10:21:31 +00:00
|
|
|
endif( NOT GPERFTOOLS_FOUND )
|
|
|
|
list(APPEND CMAKE_CXX_FLAGS ${GCC_GPERFTOOLS_FLAGS})
|
|
|
|
|
2012-12-24 02:33:50 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
################################################################################
|
|
|
|
# Doxygen - http://www.stack.nl/~dimitri/doxygen/index.html
|
|
|
|
################################################################################
|
2012-12-24 10:21:31 +00:00
|
|
|
|
2012-12-25 10:28:29 +00:00
|
|
|
find_package(Doxygen)
|
|
|
|
if(DOXYGEN_FOUND)
|
2013-12-10 20:17:57 +00:00
|
|
|
message(STATUS "Doxygen found.")
|
2013-01-17 01:47:13 +00:00
|
|
|
message(STATUS "You can build the documentation with 'make doc'." )
|
|
|
|
message(STATUS "When done, point your browser to ${CMAKE_SOURCE_DIR}/html/index.html")
|
|
|
|
set(HAVE_DOT ${DOXYGEN_DOT_FOUND})
|
|
|
|
file(TO_NATIVE_PATH ${CMAKE_SOURCE_DIR} top_srcdir)
|
|
|
|
file(TO_NATIVE_PATH ${CMAKE_BINARY_DIR} top_builddir)
|
|
|
|
find_package(LATEX)
|
|
|
|
if (PDFLATEX_COMPILER)
|
|
|
|
set(GENERATE_PDF_DOCUMENTATION "YES")
|
2013-02-01 17:47:01 +00:00
|
|
|
set(GNSSSDR_USE_MATHJAX "NO")
|
2013-01-17 01:47:13 +00:00
|
|
|
else(PDFLATEX_COMPILER)
|
|
|
|
set(GENERATE_PDF_DOCUMENTATION "NO")
|
2013-02-01 17:47:01 +00:00
|
|
|
set(GNSSSDR_USE_MATHJAX "YES")
|
2013-01-17 01:47:13 +00:00
|
|
|
endif(PDFLATEX_COMPILER)
|
|
|
|
configure_file(${CMAKE_SOURCE_DIR}/docs/doxygen/Doxyfile.in
|
|
|
|
${CMAKE_SOURCE_DIR}/docs/doxygen/Doxyfile
|
|
|
|
@ONLY
|
|
|
|
)
|
|
|
|
add_custom_target(doc
|
|
|
|
${DOXYGEN_EXECUTABLE} ${CMAKE_SOURCE_DIR}/docs/doxygen/Doxyfile
|
|
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
|
|
|
|
COMMENT "Generating API documentation with Doxygen." VERBATIM
|
|
|
|
)
|
|
|
|
if(LATEX_COMPILER)
|
|
|
|
message(STATUS "'make pdfmanual' will generate a manual at ${CMAKE_SOURCE_DIR}/docs/GNSS-SDR_manual.pdf")
|
|
|
|
add_custom_target(pdfmanual
|
|
|
|
COMMAND ${CMAKE_MAKE_PROGRAM}
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E copy refman.pdf ${CMAKE_SOURCE_DIR}/docs/GNSS-SDR_manual.pdf
|
|
|
|
COMMAND ${CMAKE_MAKE_PROGRAM} clean
|
|
|
|
DEPENDS doc
|
|
|
|
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}/docs/latex
|
|
|
|
COMMENT "Generating PDF manual with Doxygen." VERBATIM
|
|
|
|
)
|
|
|
|
endif(LATEX_COMPILER)
|
|
|
|
message(STATUS "'make doc-clean' will clean the documentation.")
|
|
|
|
add_custom_target(doc-clean
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_SOURCE_DIR}/docs/html
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E remove_directory ${CMAKE_SOURCE_DIR}/docs/latex
|
|
|
|
COMMAND ${CMAKE_COMMAND} -E remove ${CMAKE_SOURCE_DIR}/docs/GNSS-SDR_manual.pdf
|
|
|
|
COMMENT "Cleaning documentation." VERBATIM
|
|
|
|
)
|
2013-01-15 02:01:28 +00:00
|
|
|
else(DOXYGEN_FOUND)
|
2013-12-14 14:36:33 +00:00
|
|
|
message(STATUS " Doxygen has not been found in your system.")
|
|
|
|
message(STATUS " You can get nice code documentation by using it!")
|
|
|
|
message(STATUS " Get it from http://www.stack.nl/~dimitri/doxygen/index.html")
|
2013-12-21 11:39:16 +00:00
|
|
|
if(OS_IS_LINUX)
|
|
|
|
if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
|
|
|
|
message(" or simply by doing 'sudo yum install doxygen-latex'.")
|
|
|
|
else(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
|
|
|
|
message(" or simply by doing 'sudo apt-get install doxygen-latex'.")
|
|
|
|
endif(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
|
|
|
|
endif(OS_IS_LINUX)
|
|
|
|
if(OS_IS_MACOSX)
|
|
|
|
message(STATUS " or simply by doing 'sudo port install doxygen +latex'.")
|
|
|
|
endif(OS_IS_MACOSX)
|
2013-01-15 02:01:28 +00:00
|
|
|
endif(DOXYGEN_FOUND)
|
2012-12-24 02:33:50 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
################################################################################
|
|
|
|
# Armadillo - http://arma.sourceforge.net/
|
|
|
|
################################################################################
|
|
|
|
|
2013-11-27 21:11:21 +00:00
|
|
|
if(OS_IS_LINUX)
|
2013-12-05 18:36:45 +00:00
|
|
|
find_library(LAPACK lapack)
|
|
|
|
if(NOT LAPACK)
|
|
|
|
message(" The LAPACK library has not been found.")
|
2013-11-27 21:11:21 +00:00
|
|
|
message(" You can try to install it by typing:")
|
2013-12-21 11:39:16 +00:00
|
|
|
if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
|
2013-12-10 20:17:57 +00:00
|
|
|
message(" sudo yum install lapack-devel")
|
2013-12-30 02:11:32 +00:00
|
|
|
elseif(${LINUX_DISTRIBUTION} MATCHES "openSUSE")
|
|
|
|
message(" sudo zypper install lapack-devel")
|
2013-12-10 20:17:57 +00:00
|
|
|
else(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
|
|
|
|
message(" sudo apt-get install liblapack-dev")
|
|
|
|
endif(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
|
2013-11-27 21:11:21 +00:00
|
|
|
message(FATAL_ERROR "LAPACK is required to build gnss-sdr")
|
2013-12-05 18:36:45 +00:00
|
|
|
endif(NOT LAPACK)
|
|
|
|
find_library(BLAS blas)
|
|
|
|
if(NOT BLAS)
|
|
|
|
message(" The BLAS library has not been found.")
|
2013-11-27 21:11:21 +00:00
|
|
|
message(" You can try to install it by typing:")
|
2013-12-10 20:17:57 +00:00
|
|
|
if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
|
|
|
|
message(" sudo yum install blas-devel")
|
|
|
|
else(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
|
|
|
|
message(" sudo apt-get install libblas-dev")
|
|
|
|
endif(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
|
2013-11-27 21:11:21 +00:00
|
|
|
message(FATAL_ERROR "BLAS is required to build gnss-sdr")
|
2013-12-05 18:36:45 +00:00
|
|
|
endif(NOT BLAS)
|
|
|
|
find_library(GFORTRAN NAMES gfortran
|
|
|
|
PATHS /usr/lib
|
|
|
|
/usr/local/lib
|
2014-05-11 20:19:53 +00:00
|
|
|
/usr/local/lib/i386
|
2013-12-05 18:36:45 +00:00
|
|
|
/usr/lib/gcc/x86_64-linux-gnu
|
|
|
|
/usr/lib/gcc/i686-linux-gnu
|
|
|
|
/usr/lib/gcc/i386-linux-gnu
|
2013-12-11 23:27:46 +00:00
|
|
|
/usr/lib/gcc/x86_64-linux-gnu/4.6 # Ubuntu 12.04
|
2013-12-10 22:46:30 +00:00
|
|
|
/usr/lib/gcc/i686-linux-gnu/4.6
|
2013-12-05 18:36:45 +00:00
|
|
|
/usr/lib/gcc/x86_64-linux-gnu/4.7
|
|
|
|
/usr/lib/gcc/i686-linux-gnu/4.7
|
|
|
|
/usr/lib/gcc/x86_64-linux-gnu/4.8
|
|
|
|
/usr/lib/gcc/i686-linux-gnu/4.8
|
2013-12-10 20:17:57 +00:00
|
|
|
/usr/lib/gcc/x86_64-redhat-linux/4.7.2 # Fedora 18
|
|
|
|
/usr/lib/gcc/i686-redhat-linux/4.7.2
|
|
|
|
/usr/lib/gcc/x86_64-redhat-linux/4.8.1 # Fedora 19
|
|
|
|
/usr/lib/gcc/i686-redhat-linux/4.8.1
|
2013-12-11 23:27:46 +00:00
|
|
|
/usr/lib/gcc/x86_64-redhat-linux/4.4.4 # CentOS 6
|
|
|
|
/usr/lib/gcc/i686-redhat-linux/4.4.4
|
|
|
|
/usr/lib/gcc/x86_64-redhat-linux/4.8.2
|
|
|
|
/usr/lib/gcc/i686-redhat-linux/4.8.2
|
2013-12-30 02:11:32 +00:00
|
|
|
/usr/lib/gcc/i586-suse-linux/4.8 # OpenSUSE 13.1
|
|
|
|
/usr/lib/gcc/x86_64-suse-linux/4.8
|
2014-01-08 16:04:41 +00:00
|
|
|
/usr/lib/gcc/i486-linux-gnu # Debian 7
|
|
|
|
/usr/lib/gcc/i486-linux-gnu/4.4
|
|
|
|
/usr/lib/gcc/i486-linux-gnu/4.6
|
|
|
|
/usr/lib/gcc/i486-linux-gnu/4.7
|
|
|
|
/usr/lib/gcc/i486-linux-gnu/4.8
|
2013-12-05 18:36:45 +00:00
|
|
|
)
|
|
|
|
if(NOT GFORTRAN)
|
|
|
|
message(" The gfortran library has not been found.")
|
2013-12-10 20:17:57 +00:00
|
|
|
message(" You can try to install it by typing:")
|
|
|
|
if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
|
2013-12-11 23:27:46 +00:00
|
|
|
message(" sudo yum install gcc-fortran")
|
2013-12-30 02:11:32 +00:00
|
|
|
elseif(${LINUX_DISTRIBUTION} MATCHES "openSUSE")
|
|
|
|
message(" sudo zypper install gcc-fortran")
|
2013-12-10 20:17:57 +00:00
|
|
|
else(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
|
|
|
|
message(" sudo apt-get install gfortran")
|
|
|
|
endif(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
|
2013-12-05 18:36:45 +00:00
|
|
|
message(FATAL_ERROR "gfortran is required to build gnss-sdr")
|
|
|
|
endif(NOT GFORTRAN)
|
2013-11-27 21:11:21 +00:00
|
|
|
endif(OS_IS_LINUX)
|
|
|
|
|
2012-12-24 02:33:50 +00:00
|
|
|
find_package(Armadillo)
|
|
|
|
if(NOT ARMADILLO_FOUND)
|
2013-12-14 14:36:33 +00:00
|
|
|
message (STATUS " Armadillo has not been found.")
|
|
|
|
message (STATUS " Armadillo will be downloaded and built automatically ")
|
|
|
|
message (STATUS " when doing 'make'. ")
|
2014-02-02 11:14:29 +00:00
|
|
|
# Check if the patch command is available (does not come by default on Fedora or openSUSE)
|
|
|
|
find_program(PATCH_EXECUTABLE NAME patch PATHS ENV PATH)
|
|
|
|
if(NOT PATCH_EXECUTABLE)
|
|
|
|
message(" The patch command has not been found.")
|
|
|
|
message(" You can try to install it by typing:")
|
|
|
|
if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
|
|
|
|
message(" sudo yum install patch")
|
|
|
|
elseif(${LINUX_DISTRIBUTION} MATCHES "openSUSE")
|
|
|
|
message(" sudo zypper install patch")
|
|
|
|
else(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
|
|
|
|
message(" sudo apt-get install patch")
|
|
|
|
endif(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
|
|
|
|
message(FATAL_ERROR "The patch command is required to download and build armadillo")
|
|
|
|
endif(NOT PATCH_EXECUTABLE)
|
|
|
|
set(OLD_GCC false)
|
|
|
|
if(CMAKE_COMPILER_IS_GNUCC)
|
|
|
|
execute_process(COMMAND ${CMAKE_C_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION)
|
|
|
|
if(GCC_VERSION VERSION_EQUAL 4.6 OR GCC_VERSION VERSION_LESS 4.6)
|
|
|
|
set(OLD_GCC true)
|
|
|
|
endif(GCC_VERSION VERSION_EQUAL 4.6 OR GCC_VERSION VERSION_LESS 4.6)
|
|
|
|
endif(CMAKE_COMPILER_IS_GNUCC)
|
|
|
|
|
|
|
|
if(OLD_GCC)
|
|
|
|
set(armadillo_RELEASE 3.920.2)
|
|
|
|
set(armadillo_MD5 "3d0396513e2802c08152f50e18b4a1cd")
|
|
|
|
if(EXISTS ${CMAKE_CURRENT_BINARY_DIR}/download/armadillo-${armadillo_RELEASE}/armadillo-${armadillo_RELEASE}.tar.gz)
|
|
|
|
set(ARMADILLO_PATCH_FILE ${CMAKE_CURRENT_BINARY_DIR}/armadillo-${armadillo_RELEASE}/armadillo_no.patch)
|
|
|
|
file(WRITE ${ARMADILLO_PATCH_FILE} "")
|
|
|
|
else(EXISTS ${CMAKE_CURRENT_BINARY_DIR}/download/armadillo-${armadillo_RELEASE}/armadillo-${armadillo_RELEASE}.tar.gz)
|
|
|
|
set(ARMADILLO_PATCH_FILE ${CMAKE_CURRENT_BINARY_DIR}/armadillo-${armadillo_RELEASE}/armadillo_staticlib.patch)
|
|
|
|
file(WRITE ${ARMADILLO_PATCH_FILE}
|
|
|
|
"35c35
|
|
|
|
< set(ARMA_USE_WRAPPER true )
|
|
|
|
---
|
|
|
|
> set(ARMA_USE_WRAPPER false)
|
|
|
|
323c323
|
|
|
|
< add_library( armadillo SHARED src/wrap_libs )
|
|
|
|
---
|
|
|
|
> add_library( armadillo STATIC src/wrap_libs )
|
|
|
|
")
|
|
|
|
endif(EXISTS ${CMAKE_CURRENT_BINARY_DIR}/download/armadillo-${armadillo_RELEASE}/armadillo-${armadillo_RELEASE}.tar.gz)
|
|
|
|
ExternalProject_Add(
|
|
|
|
armadillo-${armadillo_RELEASE}
|
|
|
|
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/armadillo-${armadillo_RELEASE}
|
|
|
|
URL http://sourceforge.net/projects/arma/files/armadillo-${armadillo_RELEASE}.tar.gz
|
|
|
|
DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR}/download/armadillo-${armadillo_RELEASE}
|
|
|
|
URL_MD5 ${armadillo_MD5}
|
|
|
|
PATCH_COMMAND patch -N <BINARY_DIR>/CMakeLists.txt ${ARMADILLO_PATCH_FILE}
|
|
|
|
BUILD_IN_SOURCE 1
|
|
|
|
BUILD_COMMAND make
|
|
|
|
UPDATE_COMMAND ""
|
2014-05-11 20:19:53 +00:00
|
|
|
INSTALL_COMMAND ""
|
2014-02-02 11:14:29 +00:00
|
|
|
)
|
|
|
|
else(OLD_GCC)
|
2014-05-11 20:19:53 +00:00
|
|
|
set(armadillo_RELEASE 4.300.2)
|
|
|
|
set(armadillo_MD5 "16c8bf27e989b2eaf6e4096a4c056269")
|
2014-02-02 11:14:29 +00:00
|
|
|
if(EXISTS ${CMAKE_CURRENT_BINARY_DIR}/download/armadillo-${armadillo_RELEASE}/armadillo-${armadillo_RELEASE}.tar.gz)
|
|
|
|
set(ARMADILLO_PATCH_FILE ${CMAKE_CURRENT_BINARY_DIR}/armadillo-${armadillo_RELEASE}/armadillo_no.patch)
|
|
|
|
file(WRITE ${ARMADILLO_PATCH_FILE} "")
|
|
|
|
set(ARMADILLO_PATCH_FILE2 ${CMAKE_CURRENT_BINARY_DIR}/armadillo-${armadillo_RELEASE}/armadillo_no2.patch)
|
|
|
|
file(WRITE ${ARMADILLO_PATCH_FILE2} "")
|
|
|
|
else(EXISTS ${CMAKE_CURRENT_BINARY_DIR}/download/armadillo-${armadillo_RELEASE}/armadillo-${armadillo_RELEASE}.tar.gz)
|
|
|
|
set(ARMADILLO_PATCH_FILE ${CMAKE_CURRENT_BINARY_DIR}/armadillo-${armadillo_RELEASE}/armadillo_staticlib.patch)
|
|
|
|
set(ARMADILLO_PATCH_FILE2 ${CMAKE_CURRENT_BINARY_DIR}/armadillo-${armadillo_RELEASE}/armadillo_enable_lapack.patch)
|
|
|
|
file(WRITE ${ARMADILLO_PATCH_FILE}
|
2014-01-07 12:55:09 +00:00
|
|
|
"30c30
|
|
|
|
< set(ARMA_USE_LAPACK false)
|
|
|
|
---
|
|
|
|
> set(ARMA_USE_LAPACK true)
|
|
|
|
36c36
|
|
|
|
< set(ARMA_USE_WRAPPER true )
|
2013-01-03 01:48:34 +00:00
|
|
|
---
|
2013-07-04 13:47:40 +00:00
|
|
|
> set(ARMA_USE_WRAPPER false)
|
2014-05-11 20:37:43 +00:00
|
|
|
310c310
|
2014-01-07 12:55:09 +00:00
|
|
|
< add_library( armadillo SHARED \${PROJECT_SOURCE_DIR}/src/wrapper.cpp )
|
|
|
|
---
|
|
|
|
> add_library( armadillo STATIC \${PROJECT_SOURCE_DIR}/src/wrapper.cpp )
|
|
|
|
")
|
2014-02-02 11:14:29 +00:00
|
|
|
file(WRITE ${ARMADILLO_PATCH_FILE2}
|
2014-01-07 12:55:09 +00:00
|
|
|
"12c12
|
|
|
|
< // #define ARMA_USE_LAPACK
|
2013-01-03 01:48:34 +00:00
|
|
|
---
|
2014-01-07 12:55:09 +00:00
|
|
|
> #define ARMA_USE_LAPACK
|
2014-02-02 11:14:29 +00:00
|
|
|
")
|
|
|
|
endif(EXISTS ${CMAKE_CURRENT_BINARY_DIR}/download/armadillo-${armadillo_RELEASE}/armadillo-${armadillo_RELEASE}.tar.gz)
|
|
|
|
ExternalProject_Add(
|
|
|
|
armadillo-${armadillo_RELEASE}
|
|
|
|
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/armadillo-${armadillo_RELEASE}
|
|
|
|
URL http://sourceforge.net/projects/arma/files/armadillo-${armadillo_RELEASE}.tar.gz
|
|
|
|
DOWNLOAD_DIR ${CMAKE_CURRENT_BINARY_DIR}/download/armadillo-${armadillo_RELEASE}
|
|
|
|
URL_MD5 ${armadillo_MD5}
|
|
|
|
PATCH_COMMAND patch -N <BINARY_DIR>/CMakeLists.txt ${ARMADILLO_PATCH_FILE} && patch -N <BINARY_DIR>/include/armadillo_bits/config.hpp ${ARMADILLO_PATCH_FILE2}
|
|
|
|
BUILD_IN_SOURCE 1
|
|
|
|
BUILD_COMMAND make
|
|
|
|
UPDATE_COMMAND ""
|
|
|
|
INSTALL_COMMAND ""
|
|
|
|
)
|
|
|
|
endif(OLD_GCC)
|
2013-01-03 01:48:34 +00:00
|
|
|
# Set up variables
|
|
|
|
ExternalProject_Get_Property(armadillo-${armadillo_RELEASE} binary_dir)
|
|
|
|
set(ARMADILLO_INCLUDE_DIRS ${binary_dir}/include )
|
|
|
|
find_library(lapack NAMES lapack HINTS /usr/lib /usr/local/lib /usr/lib64)
|
|
|
|
find_library(blas NAMES blas HINTS /usr/lib /usr/local/lib /usr/lib64)
|
2014-05-11 20:19:53 +00:00
|
|
|
set(ARMADILLO_LIBRARIES ${lapack} ${blas} ${GFORTRAN} ${binary_dir}/${CMAKE_FIND_LIBRARY_PREFIXES}armadillo.a)
|
2014-01-08 10:20:11 +00:00
|
|
|
set(LOCAL_ARMADILLO true CACHE STRING "Armadillo downloaded and built automatically" FORCE)
|
2013-01-19 17:10:57 +00:00
|
|
|
# Save a copy at the thirdparty folder
|
|
|
|
file(COPY ${CMAKE_CURRENT_BINARY_DIR}/armadillo-${armadillo_RELEASE}
|
|
|
|
DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/armadillo
|
|
|
|
)
|
2013-01-03 01:48:34 +00:00
|
|
|
endif(NOT ARMADILLO_FOUND)
|
2012-12-24 02:33:50 +00:00
|
|
|
|
|
|
|
|
2013-10-18 18:26:06 +00:00
|
|
|
|
2013-11-27 21:11:21 +00:00
|
|
|
###############################################################################
|
2013-10-18 18:26:06 +00:00
|
|
|
# OpenCL
|
2013-11-27 21:11:21 +00:00
|
|
|
###############################################################################
|
2013-10-18 18:26:06 +00:00
|
|
|
find_package(OpenCL)
|
2014-03-15 01:21:17 +00:00
|
|
|
if($ENV{DISABLE_OPENCL})
|
|
|
|
set(DISABLE_OPENCL TRUE)
|
|
|
|
endif($ENV{DISABLE_OPENCL})
|
|
|
|
if(DISABLE_OPENCL)
|
|
|
|
set(OPENCL_FOUND FALSE)
|
|
|
|
else(DISABLE_OPENCL)
|
|
|
|
if(OPENCL_FOUND)
|
|
|
|
message(STATUS "OpenCL has been found and will be used by some processing blocks")
|
|
|
|
message(STATUS "You can disable OpenCL use by doing 'cmake -DDISABLE_OPENCL=1 ../' ")
|
|
|
|
endif(OPENCL_FOUND)
|
|
|
|
endif(DISABLE_OPENCL)
|
2013-12-05 18:36:45 +00:00
|
|
|
if(NOT OPENCL_FOUND)
|
|
|
|
message(STATUS "Processing blocks using OpenCL will not be built.")
|
|
|
|
endif(NOT OPENCL_FOUND)
|
|
|
|
|
2013-10-18 18:26:06 +00:00
|
|
|
|
|
|
|
|
2013-11-27 21:11:21 +00:00
|
|
|
################################################################################
|
|
|
|
# OpenSSL - http://www.openssl.org
|
|
|
|
################################################################################
|
|
|
|
find_package(OpenSSL)
|
|
|
|
if(NOT OPENSSL_FOUND)
|
|
|
|
message(" The OpenSSL library has not been found.")
|
|
|
|
message(" You can try to install it by typing:")
|
2013-12-10 20:17:57 +00:00
|
|
|
if(OS_IS_LINUX)
|
|
|
|
if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
|
|
|
|
message(" sudo yum install openssl-devel")
|
|
|
|
else(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
|
|
|
|
message(" sudo apt-get install libssl-dev")
|
|
|
|
endif(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "Red Hat")
|
2013-11-27 21:11:21 +00:00
|
|
|
endif(OS_IS_LINUX)
|
|
|
|
if(OS_IS_MACOSX)
|
|
|
|
message(" sudo port install openssl")
|
|
|
|
endif(OS_IS_MACOSX)
|
|
|
|
message(FATAL_ERROR "OpenSSL libraries are required to build gnss-sdr")
|
|
|
|
endif(NOT OPENSSL_FOUND)
|
|
|
|
|
2013-10-18 18:26:06 +00:00
|
|
|
|
2012-12-24 11:42:23 +00:00
|
|
|
################################################################################
|
2012-12-24 02:33:50 +00:00
|
|
|
# Setup of optional drivers
|
2012-12-24 11:42:23 +00:00
|
|
|
################################################################################
|
2012-12-24 02:33:50 +00:00
|
|
|
if( $ENV{GN3S_DRIVER} )
|
2013-12-10 20:17:57 +00:00
|
|
|
message(STATUS "GN3S_DRIVER variable found." )
|
2012-12-24 11:42:23 +00:00
|
|
|
# copy firmware to install folder
|
|
|
|
# Build project gr-gn3s
|
2012-12-27 21:11:50 +00:00
|
|
|
else( $ENV{GN3S_DRIVER} )
|
2013-07-13 11:25:48 +00:00
|
|
|
if( GN3S_DRIVER )
|
2013-12-10 20:17:57 +00:00
|
|
|
message(STATUS "GN3S driver will be compiled")
|
2013-07-13 11:25:48 +00:00
|
|
|
else( GNSS_DRIVER )
|
2013-12-10 20:17:57 +00:00
|
|
|
message(STATUS "GN3S_DRIVER is not defined." )
|
|
|
|
message(STATUS "Define it with 'export GN3S_DRIVER=1' to add support for the GN3S dongle." )
|
2013-07-13 11:25:48 +00:00
|
|
|
endif( GN3S_DRIVER )
|
2012-12-24 02:33:50 +00:00
|
|
|
endif($ENV{GN3S_DRIVER} )
|
2014-02-18 19:40:44 +00:00
|
|
|
|
|
|
|
if( $ENV{RAW_ARRAY_DRIVER} )
|
|
|
|
message(STATUS "RAW_ARRAY_DRIVER variable found." )
|
|
|
|
# copy firmware to install folder
|
|
|
|
# Build project gr-dbfcttc
|
|
|
|
else( $ENV{RAW_ARRAY_DRIVER} )
|
|
|
|
if( RAW_ARRAY_DRIVER )
|
|
|
|
message(STATUS "RAW_ARRAY_DRIVER driver will be compiled")
|
|
|
|
else( RAW_ARRAY_DRIVER )
|
|
|
|
message(STATUS "RAW_ARRAY_DRIVER is not defined." )
|
|
|
|
message(STATUS "Define it with 'export RAW_ARRAY_DRIVER=1' to add support for the CTTC experimental array front-end." )
|
|
|
|
endif( RAW_ARRAY_DRIVER )
|
|
|
|
endif($ENV{RAW_ARRAY_DRIVER} )
|
2012-12-24 02:33:50 +00:00
|
|
|
|
2012-12-24 11:42:23 +00:00
|
|
|
if( $ENV{RTLSDR_DRIVER} )
|
2013-12-10 20:17:57 +00:00
|
|
|
message(STATUS "RTLSDR_DRIVER variable found." )
|
2013-07-04 13:47:40 +00:00
|
|
|
# find libosmosdr (done in src/algorithms/signal_sources/adapters)
|
|
|
|
# find gr-osmosdr (done in src/algorithms/signal_sources/adapters)
|
2012-12-24 11:42:23 +00:00
|
|
|
endif($ENV{RTLSDR_DRIVER} )
|
|
|
|
|
2012-12-24 02:33:50 +00:00
|
|
|
|
2013-10-18 18:26:06 +00:00
|
|
|
|
2012-12-24 11:20:23 +00:00
|
|
|
########################################################################
|
|
|
|
# Set compiler flags
|
|
|
|
########################################################################
|
|
|
|
|
|
|
|
# Enable C++11 support in GCC
|
|
|
|
# For "-std=c++0x" GCC's support for C++11 see http://gcc.gnu.org/projects/cxx0x.html
|
|
|
|
if(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32)
|
2013-12-21 11:11:05 +00:00
|
|
|
set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -std=c++0x -Wall") #Add warning flags: For "-Wall" see http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
|
2012-12-24 11:20:23 +00:00
|
|
|
endif(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32)
|
2013-07-04 13:47:40 +00:00
|
|
|
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
2013-10-24 22:54:15 +00:00
|
|
|
set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -std=c++11 -stdlib=libc++ -Wno-c++11-narrowing")
|
2013-12-21 11:11:05 +00:00
|
|
|
if(CMAKE_BUILD_TYPE MATCHES "Release")
|
|
|
|
set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -Wno-unused-private-field")
|
|
|
|
endif(CMAKE_BUILD_TYPE MATCHES "Release")
|
2013-07-04 13:47:40 +00:00
|
|
|
endif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
2012-12-24 11:20:23 +00:00
|
|
|
|
2013-01-24 20:04:39 +00:00
|
|
|
# Processor-architecture related flags
|
|
|
|
# See http://gcc.gnu.org/onlinedocs/gcc/i386-and-x86_002d64-Options.html#i386-and-x86_002d64-Options
|
|
|
|
# Change to '-mtune=generic' when building for distribution
|
|
|
|
if(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32)
|
2013-10-21 22:27:39 +00:00
|
|
|
if(OS_IS_MACOSX)
|
|
|
|
set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -march=corei7 -mfpmath=sse")
|
|
|
|
else(OS_IS_MACOSX)
|
|
|
|
set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -march=native -mfpmath=sse")
|
|
|
|
endif(OS_IS_MACOSX)
|
2013-01-24 20:04:39 +00:00
|
|
|
endif(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32)
|
2012-12-25 10:28:29 +00:00
|
|
|
|
|
|
|
if(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32)
|
|
|
|
#http://gcc.gnu.org/wiki/Visibility
|
|
|
|
add_definitions(-fvisibility=hidden)
|
|
|
|
endif()
|
|
|
|
|
2012-12-24 11:20:23 +00:00
|
|
|
# Set GPerftools related flags if it is available
|
|
|
|
# See http://gperftools.googlecode.com/svn/trunk/README
|
2012-12-24 10:21:31 +00:00
|
|
|
if(GPERFTOOLS_FOUND)
|
|
|
|
if(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32)
|
2012-12-24 11:20:23 +00:00
|
|
|
set(MY_CXX_FLAGS "${MY_CXX_FLAGS} -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free")
|
2012-12-24 10:21:31 +00:00
|
|
|
endif(CMAKE_COMPILER_IS_GNUCXX AND NOT WIN32)
|
|
|
|
endif(GPERFTOOLS_FOUND)
|
2012-12-24 02:33:50 +00:00
|
|
|
|
2012-12-24 11:20:23 +00:00
|
|
|
list(APPEND CMAKE_CXX_FLAGS ${MY_CXX_FLAGS})
|
|
|
|
|
2013-12-10 20:17:57 +00:00
|
|
|
if(OS_IS_LINUX)
|
2013-12-30 02:11:32 +00:00
|
|
|
if(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "openSUSE")
|
2013-12-10 20:17:57 +00:00
|
|
|
link_libraries(pthread)
|
2013-12-30 02:11:32 +00:00
|
|
|
endif(${LINUX_DISTRIBUTION} MATCHES "Fedora" OR ${LINUX_DISTRIBUTION} MATCHES "openSUSE")
|
2013-12-10 20:17:57 +00:00
|
|
|
endif(OS_IS_LINUX)
|
|
|
|
|
2013-07-04 13:47:40 +00:00
|
|
|
|
2013-07-10 21:07:43 +00:00
|
|
|
########################################################################
|
|
|
|
# Create uninstall target
|
|
|
|
########################################################################
|
|
|
|
configure_file(
|
|
|
|
${CMAKE_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in
|
|
|
|
${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake
|
|
|
|
@ONLY)
|
|
|
|
|
|
|
|
add_custom_target(uninstall
|
|
|
|
${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake
|
|
|
|
)
|
2013-07-04 13:47:40 +00:00
|
|
|
|
2013-01-22 20:40:25 +00:00
|
|
|
|
2012-12-24 02:33:50 +00:00
|
|
|
########################################################################
|
|
|
|
# Add subdirectories (in order of deps)
|
|
|
|
########################################################################
|
|
|
|
add_subdirectory(src)
|
|
|
|
|
2013-10-01 20:32:04 +00:00
|
|
|
|