Last active
August 21, 2017 13:39
-
-
Save rsdubtso/18d25961b15667c4a0bf523933f7acb4 to your computer and use it in GitHub Desktop.
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
From 4c528abd9c9331475920c49f5f51c22dad4204c3 Mon Sep 17 00:00:00 2001 | |
From: Roman Dubtsov <dubtsov@gmail.com> | |
Date: Sun, 2 Jul 2017 14:24:31 +0700 | |
Subject: [PATCH] unofficial: update build system to support OSX | |
I'm pretty sure Xbyak does not work... | |
--- | |
CMakeLists.txt | 33 +++++++++++++++++++++++---------- | |
cmake/MKL.cmake | 20 +++++++++++++++++--- | |
examples/simple_net.c | 4 ++-- | |
examples/simple_training_net.c | 4 ++-- | |
4 files changed, 44 insertions(+), 17 deletions(-) | |
diff --git a/CMakeLists.txt b/CMakeLists.txt | |
index 4dc580c..d5de9f2 100644 | |
--- a/CMakeLists.txt | |
+++ b/CMakeLists.txt | |
@@ -16,6 +16,11 @@ | |
cmake_minimum_required(VERSION 2.8) | |
+if(POLICY CMP0042) | |
+ # XXX: what behavior do we really need ? (Roma) | |
+ cmake_policy(SET CMP0042 NEW) | |
+endif() | |
+ | |
# version handling is done with old style | |
if(POLICY CMP0048) | |
cmake_policy(SET CMP0048 OLD) | |
@@ -36,16 +41,14 @@ endif() | |
include("cmake/MKL.cmake") | |
include("cmake/Doxygen.cmake") | |
+include(CheckCXXCompilerFlag) | |
# sdl options | |
if(UNIX OR APPLE) | |
set(CMAKE_CCXX_FLAGS "${CMAKE_CCXX_FLAGS} -fPIC -Wformat -Wformat-security") | |
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -D_FORTIFY_SOURCE=2") | |
set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -D_FORTIFY_SOURCE=2") | |
- set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pie") | |
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") | |
- set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -z noexecstack -z relro -z now") | |
- set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -z noexecstack -z relro -z now") | |
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9) | |
set(CMAKE_CCXX_FLAGS "${CMAKE_CCXX_FLAGS} -fstack-protector-all") | |
else() | |
@@ -53,16 +56,20 @@ if(UNIX OR APPLE) | |
endif() | |
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") | |
set(CMAKE_CCXX_FLAGS "${CMAKE_CCXX_FLAGS} -fstack-protector-all") | |
- set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now") | |
- set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now") | |
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Intel") | |
# workaround for Intel Compiler 16.0 that produces error caused by pragma omp simd collapse(..) | |
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS "17.0") | |
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -diag-disable:13379") | |
endif() | |
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fstack-protector") | |
- set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -z noexecstack -z relro -z now") | |
- set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -z noexecstack -z relro -z now") | |
+ endif() | |
+ if(APPLE) | |
+ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-bind_at_load") | |
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-bind_at_load") | |
+ else() | |
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pie") | |
+ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now") | |
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-z,noexecstack -Wl,-z,relro -Wl,-z,now") | |
endif() | |
endif() | |
@@ -78,18 +85,24 @@ if(WIN32) | |
add_definitions(/Qpar) | |
endif() | |
elseif(UNIX OR APPLE) | |
- set(OPENMP_FLAGS "-fopenmp") | |
set(CMAKE_CCXX_FLAGS "${CMAKE_CCXX_FLAGS} ${OPENMP_FLAGS} ${CCXX_WARN_FLAGS} -DMKLDNN_DLL -DMKLDNN_DLL_EXPORTS -fvisibility=internal") | |
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${CMAKE_CCXX_FLAGS} -std=c99") | |
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_CCXX_FLAGS} -std=c++11 -fvisibility-inlines-hidden") | |
set(CCXX_WARN_FLAGS "-Wall -Werror -Wno-unknown-pragmas") | |
+ CHECK_CXX_COMPILER_FLAG("-fopenmp" COMPILER_SUPPORTS_FOPENMP) | |
+ if(COMPILER_SUPPORTS_FOPENMP) | |
+ set(OPENMP_FLAGS "-fopenmp") | |
+ endif() | |
endif() | |
if(HAVE_MKL) | |
set(CMAKE_C_CREATE_SHARED_LIBRARY_FORBIDDEN_FLAGS ${OPENMP_FLAGS}) | |
set(CMAKE_CXX_CREATE_SHARED_LIBRARY_FORBIDDEN_FLAGS ${OPENMP_FLAGS}) | |
- set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -liomp5 -Wl,--as-needed") | |
- set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -liomp5 -Wl,--as-needed") | |
+ if(NOT APPLE) | |
+ # XXX: MKL.cmake takes care of this... | |
+ set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -liomp5 -Wl,--as-needed") | |
+ set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -liomp5 -Wl,--as-needed") | |
+ endif() | |
endif() | |
if(${CMAKE_CXX_COMPILER_ID} STREQUAL "Intel") | |
diff --git a/cmake/MKL.cmake b/cmake/MKL.cmake | |
index a8a64bf..ed79891 100644 | |
--- a/cmake/MKL.cmake | |
+++ b/cmake/MKL.cmake | |
@@ -52,12 +52,14 @@ function(detect_mkl LIBNAME) | |
PATHS ${MKLROOT}/lib ${MKLROOT}/lib/intel64 | |
$ENV{MKLROOT}/lib $ENV{MKLROOT}/lib/intel64 | |
${__mklinc_root}/lib ${__mklinc_root}/lib/intel64) | |
+ | |
if(MKLINC AND MKLLIB) | |
set(HAVE_MKL TRUE PARENT_SCOPE) | |
get_filename_component(MKLLIBPATH "${MKLLIB}" PATH) | |
string(FIND "${MKLLIBPATH}" ${CMAKE_CURRENT_SOURCE_DIR}/external __idx) | |
if(${__idx} EQUAL 0) | |
- install(PROGRAMS ${MKLLIB} ${MKLLIBPATH}/libiomp5.so | |
+ install(PROGRAMS ${MKLLIB} | |
+ ${MKLLIBPATH}/${CMAKE_SHARED_LIBRARY_PREFIX}iomp5${CMAKE_SHARED_LIBRARY_SUFFIX} | |
DESTINATION lib) | |
endif() | |
endif() | |
@@ -65,9 +67,12 @@ endfunction() | |
if(WIN32) | |
detect_mkl("mklml") | |
+elseif(APPLE) | |
+ detect_mkl("${CMAKE_SHARED_LIBRARY_PREFIX}mklml${CMAKE_SHARED_LIBRARY_SUFFIX}") | |
+ detect_mkl("${CMAKE_SHARED_LIBRARY_PREFIX}mkl_rt${CMAKE_SHARED_LIBRARY_SUFFIX}") | |
elseif(UNIX) | |
- detect_mkl("libmklml_intel.so") | |
- detect_mkl("libmkl_rt.so") | |
+ detect_mkl("${CMAKE_SHARED_LIBRARY_PREFIX}mklml_intel${CMAKE_SHARED_LIBRARY_SUFFIX}") | |
+ detect_mkl("${CMAKE_SHARED_LIBRARY_PREFIX}mkl_rt${CMAKE_SHARED_LIBRARY_SUFFIX}") | |
endif() | |
set(FAIL_WITHOUT_MKL) | |
@@ -76,6 +81,15 @@ if(HAVE_MKL) | |
add_definitions(-DUSE_MKL -DUSE_CBLAS) | |
include_directories(AFTER ${MKLINC}) | |
list(APPEND mkldnn_LINKER_LIBS ${MKLLIB}) | |
+ if(APPLE) | |
+ # XXX: hack to link to libiomp5.dylib | |
+ get_filename_component(MKLLIBPATH "${MKLLIB}" PATH) | |
+ find_library(OMP5LIB NAMES libiomp5.dylib | |
+ PATHS ${MKLLIBPATH} ${MKLLIBPATH}/../../compiler) | |
+ if (OMP5LIB) | |
+ list(APPEND mkldnn_LINKER_LIBS ${OMP5LIB}) | |
+ endif() | |
+ endif() | |
message(STATUS "Intel(R) MKL found: include ${MKLINC}, lib ${MKLLIB}") | |
else() | |
if(DEFINED ENV{FAIL_WITHOUT_MKL} OR DEFINED FAIL_WITHOUT_MKL) | |
diff --git a/examples/simple_net.c b/examples/simple_net.c | |
index 1dc796a..a71df0a 100644 | |
--- a/examples/simple_net.c | |
+++ b/examples/simple_net.c | |
@@ -15,7 +15,6 @@ | |
*******************************************************************************/ | |
#include <string.h> | |
-#include <malloc.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include "mkldnn.h" | |
@@ -44,7 +43,8 @@ void *aligned_malloc(size_t size, size_t alignment) { | |
#elif defined(_SX) | |
return malloc(size); | |
#else | |
- return memalign(alignment, size); | |
+ void *p; | |
+ return !posix_memalign(&p, alignment, size) ? p : NULL; | |
#endif | |
} | |
diff --git a/examples/simple_training_net.c b/examples/simple_training_net.c | |
index b22a225..8978e92 100644 | |
--- a/examples/simple_training_net.c | |
+++ b/examples/simple_training_net.c | |
@@ -15,7 +15,6 @@ | |
*******************************************************************************/ | |
#include <string.h> | |
-#include <malloc.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <math.h> | |
@@ -46,7 +45,8 @@ void *aligned_malloc(size_t size, size_t alignment) { | |
#ifdef WIN32 | |
return _aligned_malloc(size, alignment); | |
#else | |
- return memalign(alignment, size); | |
+ void *p; | |
+ return !posix_memalign(&p, alignment, size) ? p : NULL; | |
#endif | |
} | |
-- | |
2.11.0 (Apple Git-81) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment