| # |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, software |
| # distributed under the License is distributed on an "AS IS" BASIS, |
| # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| # See the License for the specific language governing permissions and |
| # limitations under the License. |
| # |
| |
| # |
| # Common CMake utilities and configuration, shared by all Native components. |
| # |
| |
| # |
| # Platform-specific prerequisite checks. |
| # |
| |
| if(CMAKE_SYSTEM_NAME STREQUAL "SunOS") |
| # Only 64-bit Java is supported. |
| if(NOT JVM_ARCH_DATA_MODEL EQUAL 64) |
| message(FATAL_ERROR "Unrecognised JVM_ARCH_DATA_MODEL '${JVM_ARCH_DATA_MODEL}'. " |
| "A 64-bit JVM must be used on Solaris, make sure that one is installed and, " |
| "if necessary, the MAVEN_OPTS environment variable includes '-d64'") |
| endif() |
| |
| # Only gcc is suported for now. |
| if(NOT(CMAKE_COMPILER_IS_GNUCC AND CMAKE_COMPILER_IS_GNUCXX)) |
| message(FATAL_ERROR "Only gcc is supported on Solaris") |
| endif() |
| endif() |
| |
| # |
| # Helper functions and macros. |
| # |
| |
| # Add flags to all the CMake compiler variables |
| macro(hadoop_add_compiler_flags FLAGS) |
| set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FLAGS}") |
| set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FLAGS}") |
| endmacro() |
| |
| # Add flags to all the CMake linker variables. |
| macro(hadoop_add_linker_flags FLAGS) |
| set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${FLAGS}") |
| set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${FLAGS}") |
| endmacro() |
| |
| # Compile a library with both shared and static variants. |
| function(hadoop_add_dual_library LIBNAME) |
| add_library(${LIBNAME} SHARED ${ARGN}) |
| add_library(${LIBNAME}_static STATIC ${ARGN}) |
| set_target_properties(${LIBNAME}_static PROPERTIES OUTPUT_NAME ${LIBNAME}) |
| endfunction() |
| |
| # Link both a static and a dynamic target against some libraries. |
| function(hadoop_target_link_dual_libraries LIBNAME) |
| target_link_libraries(${LIBNAME} ${ARGN}) |
| target_link_libraries(${LIBNAME}_static ${ARGN}) |
| endfunction() |
| |
| # Set all the output directories to the same place. |
| function(hadoop_output_directory TGT DIR) |
| set_target_properties(${TGT} PROPERTIES RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${DIR}") |
| set_target_properties(${TGT} PROPERTIES ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${DIR}") |
| set_target_properties(${TGT} PROPERTIES LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/${DIR}") |
| endfunction() |
| |
| # Set the target directories for dynamic and static builds. |
| function(hadoop_dual_output_directory TGT DIR) |
| hadoop_output_directory(${TGT} "${DIR}") |
| hadoop_output_directory(${TGT}_static "${DIR}") |
| endfunction() |
| |
| # Alter the behavior of find_package and find_library so that we find only |
| # shared libraries with a given version suffix. You should save |
| # CMAKE_FIND_LIBRARY_SUFFIXES before calling this function and restore it |
| # afterwards. On Windows this function is a no-op. Windows does not encode |
| # version number information information into library path names. |
| macro(hadoop_set_find_shared_library_version LVERS) |
| if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") |
| # Mac OS uses .dylib |
| set(CMAKE_FIND_LIBRARY_SUFFIXES ".${LVERS}.dylib") |
| elseif(${CMAKE_SYSTEM_NAME} MATCHES "FreeBSD") |
| # FreeBSD has always .so installed. |
| set(CMAKE_FIND_LIBRARY_SUFFIXES ".so") |
| elseif(${CMAKE_SYSTEM_NAME} MATCHES "Windows") |
| # Windows doesn't support finding shared libraries by version. |
| else() |
| # Most UNIX variants use .so |
| set(CMAKE_FIND_LIBRARY_SUFFIXES ".so.${LVERS}") |
| endif() |
| endmacro() |
| |
| # Alter the behavior of find_package and find_library so that we find only |
| # shared libraries without any version suffix. You should save |
| # CMAKE_FIND_LIBRARY_SUFFIXES before calling this function and restore it |
| # afterwards. On Windows this function is a no-op. Windows does not encode |
| # version number information information into library path names. |
| macro(hadoop_set_find_shared_library_without_version) |
| if(${CMAKE_SYSTEM_NAME} MATCHES "Darwin") |
| # Mac OS uses .dylib |
| set(CMAKE_FIND_LIBRARY_SUFFIXES ".dylib") |
| elseif(${CMAKE_SYSTEM_NAME} MATCHES "Windows") |
| # No effect |
| else() |
| # Most UNIX variants use .so |
| set(CMAKE_FIND_LIBRARY_SUFFIXES ".so") |
| endif() |
| endmacro() |
| |
| |
| # set the shared compiler flags |
| # support for GNU C/C++, add other compilers as necessary |
| |
| if (CMAKE_C_COMPILER_ID STREQUAL "GNU" OR |
| CMAKE_C_COMPILER_ID STREQUAL "Clang" OR |
| CMAKE_C_COMPILER_ID STREQUAL "AppleClang") |
| if(NOT DEFINED GCC_SHARED_FLAGS) |
| find_package(Threads REQUIRED) |
| if(CMAKE_USE_PTHREADS_INIT) |
| set(GCC_SHARED_FLAGS "-g -O2 -Wall -pthread -D_FILE_OFFSET_BITS=64") |
| else() |
| set(GCC_SHARED_FLAGS "-g -O2 -Wall -D_FILE_OFFSET_BITS=64") |
| endif() |
| endif() |
| endif() |
| |
| # Set the shared linker flags. |
| hadoop_add_compiler_flags("${GCC_SHARED_FLAGS}") |
| hadoop_add_linker_flags("${LINKER_SHARED_FLAGS}") |
| |
| # |
| # Linux-specific configuration. |
| # |
| if(CMAKE_SYSTEM_NAME STREQUAL "Linux") |
| # Make GNU extensions available. |
| hadoop_add_compiler_flags("-D_GNU_SOURCE") |
| |
| # If JVM_ARCH_DATA_MODEL is 32, compile all binaries as 32-bit. |
| if(JVM_ARCH_DATA_MODEL EQUAL 32) |
| # Force 32-bit code generation on amd64/x86_64, ppc64, sparc64 |
| if(CMAKE_COMPILER_IS_GNUCC AND CMAKE_SYSTEM_PROCESSOR MATCHES ".*64") |
| hadoop_add_compiler_flags("-m32") |
| hadoop_add_linker_flags("-m32") |
| endif() |
| # Set CMAKE_SYSTEM_PROCESSOR to ensure that find_package(JNI) will use 32-bit libraries |
| if(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "amd64") |
| set(CMAKE_SYSTEM_PROCESSOR "i686") |
| endif() |
| endif() |
| |
| # Determine float ABI of JVM on ARM. |
| if(CMAKE_SYSTEM_PROCESSOR MATCHES "^arm") |
| find_program(READELF readelf) |
| if(READELF MATCHES "NOTFOUND") |
| message(WARNING "readelf not found; JVM float ABI detection disabled") |
| else(READELF MATCHES "NOTFOUND") |
| execute_process( |
| COMMAND ${READELF} -A ${JAVA_JVM_LIBRARY} |
| OUTPUT_VARIABLE JVM_ELF_ARCH |
| ERROR_QUIET) |
| if(NOT JVM_ELF_ARCH MATCHES "Tag_ABI_VFP_args: VFP registers") |
| # Test compilation with -mfloat-abi=softfp using an arbitrary libc function |
| # (typically fails with "fatal error: bits/predefs.h: No such file or directory" |
| # if soft-float dev libraries are not installed) |
| message("Soft-float JVM detected") |
| include(CMakePushCheckState) |
| cmake_push_check_state() |
| set(CMAKE_REQUIRED_FLAGS "${CMAKE_REQUIRED_FLAGS} -mfloat-abi=softfp") |
| include(CheckSymbolExists) |
| check_symbol_exists(exit stdlib.h SOFTFP_AVAILABLE) |
| if(NOT SOFTFP_AVAILABLE) |
| message(FATAL_ERROR "Soft-float dev libraries required (e.g. 'apt-get install libc6-dev-armel' on Debian/Ubuntu)") |
| endif() |
| cmake_pop_check_state() |
| hadoop_add_compiler_flags("-mfloat-abi=softfp") |
| endif() |
| endif() |
| endif() |
| |
| # |
| # Solaris-specific configuration. |
| # |
| elseif(CMAKE_SYSTEM_NAME STREQUAL "SunOS") |
| # Solaris flags. 64-bit compilation is mandatory, and is checked earlier. |
| hadoop_add_compiler_flags("-m64 -D_POSIX_C_SOURCE=200112L -D__EXTENSIONS__ -D_POSIX_PTHREAD_SEMANTICS") |
| set(CMAKE_C_FLAGS "-std=gnu99 ${CMAKE_C_FLAGS}") |
| set(CMAKE_CXX_FLAGS "-std=gnu++98 ${CMAKE_CXX_FLAGS}") |
| hadoop_add_linker_flags("-m64") |
| |
| # CMAKE_SYSTEM_PROCESSOR is set to the output of 'uname -p', which on Solaris is |
| # the 'lowest' ISA supported, i.e. 'i386' or 'sparc'. However in order for the |
| # standard CMake modules to look in the right places it needs to reflect the required |
| # compilation mode, i.e. 64 bit. We therefore force it to either 'amd64' or 'sparcv9'. |
| if(CMAKE_SYSTEM_PROCESSOR STREQUAL "i386") |
| set(CMAKE_SYSTEM_PROCESSOR "amd64") |
| set(CMAKE_LIBRARY_ARCHITECTURE "amd64") |
| elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "sparc") |
| set(CMAKE_SYSTEM_PROCESSOR "sparcv9") |
| set(CMAKE_LIBRARY_ARCHITECTURE "sparcv9") |
| else() |
| message(FATAL_ERROR "Unrecognised CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR}") |
| endif() |
| endif() |