[Openmp-dev] [PATCH] Initial cmake support
Alp Toker
alp at nuanti.com
Sat May 31 16:01:15 PDT 2014
Thanks Jack, this is looking great..
It'll need a documentation update to make it clear that the CMake build
system is as yet unsupported and not to be used for production builds.
Otherwise, there are just a few minor nits below to be addressed, review
comments inline...
On 01/06/2014 01:31, Jack Howarth wrote:
> The attached patch adds the file, runtime/src/CMakelists.txt, which is
> modeled on the approach taken in the pathscale/openmprtl cmake
> support. This initial cmake support was designed with the goal of
> producing as identical of a build as possible to that obtained via
> build.pl <http://build.pl> using…
>
> make compiler=clang
>
> on both darwin and linux. The main limitation of the current
> implementation is that, due to the absence of integrated exported
> symbol list support in cmake, the cmake build doesn't limit the
> exported symbols as does the build.pl <http://build.pl> method. This
> theoretically can be added but we will have to replicate the exact
> steps used by build.pl <http://build.pl> via an complex set of
> add_custom_command's. The current cmake support is used by…
>
> % cd openmp/runtime/src
> % mkdir build
> % cd build
> % cmake ..
> % make VERBOSE=1
>
> The build leaves the libiomp5.[so/dylib] shared library and omp.h
> header in the build directory. TODO items also include adding support
> for 'make install' to the cmake support. I chose to place the entire
> CMakefile.txt within a single file, unlike the pathscale ones, to keep
> it unified for readability and ease of coding further changes.
We should add a top-level CMake file that includes this one, same as the
other LLVM projects.
I'd prefer to do that from the get-go instead of changing the build
procedure in a follow-up commit. Should only be a couple of lines and an
include.
> This has been tested on x86_64-apple-darwin12/13 against the clang
> from Xcode 5.1.1. and on x86_64 Fedora 15 against the current
> clang-omp 3.4. I plan on testing additional changes to allow powerpc
> cmake builds of openmp as well. Our fink llvm34-3.4.1-0f packaging
> with current clang-omp merged should allow this to be tested on ppc
> darwin9.
> Jack
> Index: runtime/src/CMakeLists.txt
> ===================================================================
> --- runtime/src/CMakeLists.txt (revision 0)
> +++ runtime/src/CMakeLists.txt (working copy)
> @@ -0,0 +1,146 @@
> +project(openmp)
> +cmake_minimum_required(VERSION 2.8)
> +
> +set(VERSION 5)
> +set(OMP_VERSION "201107")
> +set(OMP_VERSION_NUM "40")
> +
> +execute_process(COMMAND "date" "+%Y-%m-%d %H:%M:%S" OUTPUT_VARIABLE
> BUILD_TIME)
> +string(REGEX REPLACE "\n" "" BUILD_TIME ${BUILD_TIME})
> +
> +include_directories(
> + .
> + include
> + include/${OMP_VERSION}
> + i18n
> + thirdparty/ittnotify
> + ${CMAKE_CURRENT_BINARY_DIR}
> + )
Please use two leading spaces for per indentation level everywhere to
match LLVM CMake style. In your patch there's a mix of 1, 2 and 8+
spaces in various places.
> +
> +if(WIN32)
> + set(OS_GEN "win")
> +elseif(UNIX)
> + set(OS_GEN "lin")
> +elseif(APPLE)
> + set(OS_GEN "mac")
Place the APPLE check above UNIX.
> +endif()
It's worth handling the else() condition above with an error. Should be
simple enough going by examples in LLVM's CMake.
> +
> +if("${ARCH}" STREQUAL "")
> + set(ARCH "32e")
> +endif()
> +
> +set(ARCH_STR "Intel(R) 64")
> +
> +set(FEATURE_FLAGS "-D USE_ITT_BUILD")
> +set(FEATURE_FLAGS "${FEATURE_FLAGS} -D NDEBUG")
> +set(FEATURE_FLAGS "${FEATURE_FLAGS} -D
> KMP_ARCH_STR=\"\\\"${ARCH_STR}\\\"\"")
> +set(FEATURE_FLAGS "${FEATURE_FLAGS} -D _GNU_SOURCE")
> +set(FEATURE_FLAGS "${FEATURE_FLAGS} -D _REENTRANT")
> +set(FEATURE_FLAGS "${FEATURE_FLAGS} -D KMP_USE_ASSERT")
> +set(FEATURE_FLAGS "${FEATURE_FLAGS} -D BUILD_I8")
> +set(FEATURE_FLAGS "${FEATURE_FLAGS} -D BUILD_TV")
> +if(APPLE)
> + set(FEATURE_FLAGS "${FEATURE_FLAGS} -D
> KMP_LIBRARY_FILE=\\\"libiomp5.dylib\\\"")
We'll eventually want to use the CMake variables to detect the
dylib/so/dll etc. extension, but for now I'm fine to go with what you have.
> + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}
> -current_version 5.0")
> + set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}
> -compatibility_version 5.0")
> +else()
> + set(FEATURE_FLAGS "${FEATURE_FLAGS} -D
> KMP_LIBRARY_FILE=\\\"libiomp5.so\\\"")
> +endif()
> +set(FEATURE_FLAGS "${FEATURE_FLAGS} -D KMP_VERSION_MAJOR=${VERSION}")
> +set(FEATURE_FLAGS "${FEATURE_FLAGS} -D CACHE_LINE=64")
> +set(FEATURE_FLAGS "${FEATURE_FLAGS} -D KMP_ADJUST_BLOCKTIME=1")
> +set(FEATURE_FLAGS "${FEATURE_FLAGS} -D BUILD_PARALLEL_ORDERED")
> +set(FEATURE_FLAGS "${FEATURE_FLAGS} -D KMP_ASM_INTRINS")
> +set(FEATURE_FLAGS "${FEATURE_FLAGS} -D USE_LOAD_BALANCE")
> +set(FEATURE_FLAGS "${FEATURE_FLAGS} -D USE_CBLKDATA")
> +set(FEATURE_FLAGS "${FEATURE_FLAGS} -D GUIDEDLL_EXPORTS")
> +set(FEATURE_FLAGS "${FEATURE_FLAGS} -D KMP_GOMP_COMPAT")
> +set(FEATURE_FLAGS "${FEATURE_FLAGS} -D KMP_USE_ADAPTIVE_LOCKS=1")
> +set(FEATURE_FLAGS "${FEATURE_FLAGS} -D KMP_DEBUG_ADAPTIVE_LOCKS=0")
> +set(FEATURE_FLAGS "${FEATURE_FLAGS} -D OMP_50_ENABLED=0")
> +set(FEATURE_FLAGS "${FEATURE_FLAGS} -D OMP_41_ENABLED=0")
> +set(FEATURE_FLAGS "${FEATURE_FLAGS} -D OMP_40_ENABLED=1")
> +set(FEATURE_FLAGS "${FEATURE_FLAGS} -D OMP_30_ENABLED=1")
> +set(FEATURE_FLAGS "${FEATURE_FLAGS} -D USE_ITT_NOTIFY=1")
> +set(FEATURE_FLAGS "${FEATURE_FLAGS} -D
> INTEL_ITTNOTIFY_PREFIX=__kmp_itt_")
> +if (NOT APPLE)
> + set(FEATURE_FLAGS "${FEATURE_FLAGS} -D KMP_TDATA_GTID")
> +endif()
> +set(FEATURE_FLAGS "${FEATURE_FLAGS} -D
> _KMP_BUILD_TIME=\"\\\"${BUILD_TIME} UTC\\\"\"")
> +
> +set(COMMON_FLAGS "-fPIC")
> +set(COMMON_FLAGS "${COMMON_FLAGS} -Wno-unused-value")
> +set(COMMON_FLAGS "${COMMON_FLAGS} -Wno-switch")
> +set(COMMON_FLAGS "${COMMON_FLAGS} -Wno-deprecated-register")
> +set(COMMON_FLAGS "${COMMON_FLAGS} -fno-exceptions")
> +
> +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${FEATURE_FLAGS}
> ${COMMON_FLAGS}")
> +set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${FEATURE_FLAGS} ${COMMON_FLAGS}")
> +
> +set(ASM_SOURCES
> + z_Linux_asm.s
> +)
> +set(SOURCES
> + thirdparty/ittnotify/ittnotify_static.c
> + kmp_affinity.cpp
> + kmp_alloc.c
> + kmp_atomic.c
> + kmp_cancel.cpp
> + kmp_csupport.c
> + kmp_debug.c
> + kmp_dispatch.cpp
> + kmp_environment.c
> + kmp_error.c
> + kmp_ftn_cdecl.c
> + kmp_ftn_extra.c
> + kmp_global.c
> + kmp_gsupport.c
> + kmp_global.c
> + kmp_i18n.c
> + kmp_io.c
> + kmp_itt.c
> + kmp_lock.cpp
> + kmp_runtime.c
> + kmp_sched.cpp
> + kmp_settings.c
> + kmp_str.c
> + kmp_taskdeps.cpp
> + kmp_tasking.c
> + kmp_taskq.c
> + kmp_threadprivate.c
> + kmp_utility.c
> + kmp_version.c
> + z_Linux_util.c
> +)
> +
> +set_source_files_properties(${SOURCES} PROPERTIES LANGUAGE CXX)
> +set_source_files_properties(${ASM_SOURCES} PROPERTIES LANGUAGE CXX)
> +
> +set(CMAKE_CXX_COMPILER "clang++")
This is kind of weird. Doesn't it work without setting CMAKE_CXX_COMPILER?
Alp.
> +
> +add_custom_command(
> + OUTPUT kmp_i18n_id.inc
> + COMMAND perl
> ${CMAKE_CURRENT_SOURCE_DIR}/../tools/message-converter.pl
> --os=${OS_GEN} --arch=${ARCH} --prefix=kmp_i18n --enum=kmp_i18n_id.inc
> ${CMAKE_CURRENT_SOURCE_DIR}/i18n/en_US.txt
> + )
> +add_custom_command(
> + OUTPUT kmp_i18n_default.inc
> + COMMAND perl
> ${CMAKE_CURRENT_SOURCE_DIR}/../tools/message-converter.pl
> --os=${OS_GEN} --arch=${ARCH} --prefix=kmp_i18n
> --default=kmp_i18n_default.inc ${CMAKE_CURRENT_SOURCE_DIR}/i18n/en_US.txt
> + )
> +add_custom_command(
> + OUTPUT omp.h
> + COMMAND perl ${CMAKE_CURRENT_SOURCE_DIR}/../tools/expand-vars.pl
> --strict -D Revision=\"\\$$Revision\" -D Date=\"\\$$Date\" -D
> KMP_TYPE=\"Performance\" -D KMP_ARCH=\"\\\"${ARCH_STR}\\\"\" -D
> KMP_VERSION_MAJOR=${VERSION} -D KMP_VERSION_MINOR=0 -D
> KMP_VERSION_BUILD=00000000 -D KMP_BUILD_DATE=\"${BUILD_TIME} UTC\" -D
> KMP_TARGET_COMPILER=12 -D KMP_DIAG=0 -D KMP_DEBUG_INFO=0 -D
> OMP_VERSION=${OMP_VERSION}
> ${CMAKE_CURRENT_SOURCE_DIR}/include/${OMP_VERSION_NUM}/omp.h.var omp.h
> + )
> +add_custom_command(
> + OUTPUT z_Linux_asm.o
> + COMMAND ${CMAKE_CXX_COMPILER} -c -o z_Linux_asm.o -D KMP_ASM_INTRINS
> -D KMP_GOMP_COMPAT -D KMP_ARCH_X86_64 -x assembler-with-cpp
> ${CMAKE_CURRENT_SOURCE_DIR}/${ASM_SOURCES}
> +)
> +
> +add_custom_target(gen_kmp_i18n DEPENDS kmp_i18n_id.inc
> kmp_i18n_default.inc omp.h z_Linux_asm.o)
> +
> +if(NOT APPLE)
> + set(CMAKE_SHARED_LINKER_FLAGS
> "-Wl,--version-script=${CMAKE_CURRENT_SOURCE_DIR}/exports_so.txt")
> +endif()
> +
> +add_library(iomp5 SHARED ${SOURCES} z_Linux_asm.o)
> +add_dependencies(iomp5 gen_kmp_i18n)
> +
>
>
> _______________________________________________
> Openmp-dev mailing list
> Openmp-dev at dcs-maillist2.engr.illinois.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/openmp-dev
--
http://www.nuanti.com
the browser experts
More information about the Openmp-dev
mailing list