This patch integrates the libiomp CMake build system into the LLVM CMake build system so that users can checkout libiomp into the projects directory of llvm and build llvm,clang, and libiomp all together. These changes specifically introduce a new install target which will put libraries and headers into the correct locations when either a standalone build or part of llvm. The copy_recipe() method has been removed in favor of the POST_BUILD method to move headers into the exports subdirectory. And lastly, the MicroTests.cmake file was refactored which led to simpler target dependencies and a new target, make libiomp-micro-tests, which performs the 5 small tests (test-relo, test-touch, etc.) when called. git-svn-id: https://llvm.org/svn/llvm-project/openmp/trunk@236534 91177308-0d34-0410-b5e6-96231b3b80d8
219 lines
8.7 KiB
CMake
219 lines
8.7 KiB
CMake
#
|
|
#//===----------------------------------------------------------------------===//
|
|
#//
|
|
#// The LLVM Compiler Infrastructure
|
|
#//
|
|
#// This file is dual licensed under the MIT and the University of Illinois Open
|
|
#// Source Licenses. See LICENSE.txt for details.
|
|
#//
|
|
#//===----------------------------------------------------------------------===//
|
|
#
|
|
|
|
######################################################
|
|
# MICRO TESTS
|
|
# The following micro-tests are small tests to perform on
|
|
# the library just created in ${build_dir}/, there are currently
|
|
# five micro-tests:
|
|
# (1) test-touch
|
|
# - Compile and run a small program using newly created libiomp5 library
|
|
# - Fails if test-touch.c does not compile or if test-touch.c does not run after compilation
|
|
# - Program dependencies: gcc or g++, grep, bourne shell
|
|
# - Available for all Linux,Mac,Windows builds. Not availble on Intel(R) MIC Architecture builds.
|
|
# (2) test-relo
|
|
# - Tests dynamic libraries for position-dependent code (can not have any position dependent code)
|
|
# - Fails if TEXTREL is in output of readelf -d libiomp5.so command
|
|
# - Program dependencies: readelf, grep, bourne shell
|
|
# - Available for Linux, Intel(R) MIC Architecture dynamic library builds. Not available otherwise.
|
|
# (3) test-execstack
|
|
# - Tests if stack is executable
|
|
# - Fails if stack is executable. Should only be readable and writable. Not exectuable.
|
|
# - Program dependencies: perl, readelf
|
|
# - Available for Linux dynamic library builds. Not available otherwise.
|
|
# (4) test-instr (Intel(R) MIC Architecutre only)
|
|
# - Tests Intel(R) MIC Architecture libraries for valid instruction set
|
|
# - Fails if finds invalid instruction for Intel(R) MIC Architecture (wasn't compiled with correct flags)
|
|
# - Program dependencies: perl, objdump
|
|
# - Available for Intel(R) MIC Architecture builds. Not available otherwise.
|
|
# (5) test-deps
|
|
# - Tests newly created libiomp5 for library dependencies
|
|
# - Fails if sees a dependence not listed in td_exp variable below
|
|
# - Program dependencies: perl, (linux)readelf, (mac)otool[64], (windows)link.exe
|
|
# - Available for Linux,Mac,Windows, Intel(R) MIC Architecture dynamic builds and Windows static builds. Not available otherwise.
|
|
#
|
|
# All tests can be turned off by including -Dtests=off when calling cmake
|
|
# An individual test can be turned off by issuing something like -Dtest_touch=off when calling cmake
|
|
|
|
# test-touch
|
|
if(${WINDOWS})
|
|
set(do_test_touch_mt TRUE)
|
|
if(${do_test_touch_mt})
|
|
set(test_touch_items ${test_touch_items} test-touch-md test-touch-mt)
|
|
else()
|
|
set(test_touch_items ${test_touch_items} test-touch-md)
|
|
endif()
|
|
else()
|
|
set(test_touch_items ${test_touch_items} test-touch-rt)
|
|
endif()
|
|
set(regular_test_touch_items "${test_touch_items}")
|
|
add_suffix("/.success" regular_test_touch_items)
|
|
# test-touch : ${test_touch_items}/.success
|
|
set(ldeps "${regular_test_touch_items}")
|
|
add_custom_target(libiomp-test-touch DEPENDS ${ldeps})
|
|
|
|
if(${WINDOWS})
|
|
# pick test-touch compiler
|
|
set(tt-c cl)
|
|
# test-touch compilation flags
|
|
list(APPEND tt-c-flags -nologo)
|
|
if(${RELEASE_BUILD} OR ${RELWITHDEBINFO_BUILD})
|
|
list(APPEND tt-c-flags-mt -MT)
|
|
list(APPEND tt-c-flags-md -MD)
|
|
else()
|
|
list(APPEND tt-c-flags-mt -MTd)
|
|
list(APPEND tt-c-flags-md -MDd)
|
|
endif()
|
|
list(APPEND tt-libs ${build_dir}/${imp_file})
|
|
list(APPEND tt-ld-flags -link -nodefaultlib:oldnames)
|
|
if(${IA32})
|
|
list(APPEND tt-ld-flags -safeseh)
|
|
endif()
|
|
list(APPEND tt-ld-flags-v -verbose)
|
|
else() # (Unix based systems, Intel(R) MIC Architecture, and Mac)
|
|
# pick test-touch compiler
|
|
if(${STD_CPP_LIB})
|
|
set(tt-c ${CMAKE_CXX_COMPILER})
|
|
else()
|
|
set(tt-c ${CMAKE_C_COMPILER})
|
|
endif()
|
|
# test-touch compilation flags
|
|
if(${LINUX})
|
|
list(APPEND tt-c-flags -pthread)
|
|
endif()
|
|
if(${IA32})
|
|
list(APPEND tt-c-flags -m32)
|
|
elseif(${INTEL64})
|
|
list(APPEND tt-c-flags -m64)
|
|
endif()
|
|
list(APPEND tt-libs ${build_dir}/${lib_file})
|
|
if(${MAC})
|
|
list(APPEND tt-ld-flags-v -Wl,-t)
|
|
set(tt-env "DYLD_LIBRARY_PATH=.:$ENV{DYLD_LIBRARY_PATH}")
|
|
else()
|
|
list(APPEND tt-ld-flags-v -Wl,--verbose)
|
|
set(tt-env LD_LIBRARY_PATH=".:${build_dir}:$ENV{LD_LIBRARY_PATH}")
|
|
endif()
|
|
endif()
|
|
list(APPEND tt-c-flags "${tt-c-flags-rt}")
|
|
list(APPEND tt-env "KMP_VERSION=1")
|
|
|
|
macro(test_touch_recipe test_touch_dir)
|
|
set(ldeps ${src_dir}/test-touch.c lib)
|
|
set(tt-exe-file ${test_touch_dir}/test-touch${exe})
|
|
if(${WINDOWS})
|
|
# ****** list(APPEND tt-c-flags -Fo$(dir $@)test-touch${obj} -Fe$(dir $@)test-touch${exe}) *******
|
|
set(tt-c-flags-out -Fo${test_touch_dir}/test-touch${obj} -Fe${test_touch_dir}/test-touch${exe})
|
|
list(APPEND ldeps ${build_dir}/${imp_file})
|
|
else()
|
|
# ****** list(APPEND tt-c-flags -o $(dir $@)test-touch${exe}) ********
|
|
set(tt-c-flags-out -o ${test_touch_dir}/test-touch${exe})
|
|
endif()
|
|
add_custom_command(
|
|
OUTPUT ${test_touch_dir}/.success
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory ${build_dir}/${test_touch_dir}
|
|
COMMAND ${CMAKE_COMMAND} -E remove -f ${test_touch_dir}/*
|
|
COMMAND ${tt-c} ${tt-c-flags-out} ${tt-c-flags} ${src_dir}/test-touch.c ${tt-libs} ${tt-ld-flags}
|
|
COMMAND ${CMAKE_COMMAND} -E remove -f ${tt-exe-file}
|
|
COMMAND ${tt-c} ${tt-c-flags-out} ${tt-c-flags} ${src_dir}/test-touch.c ${tt-libs} ${tt-ld-flags} ${tt-ld-flags-v} > ${test_touch_dir}/build.log 2>&1
|
|
COMMAND ${tt-env} ${tt-exe-file}
|
|
#COMMAND grep -i -e \"[^_]libirc\" ${test_touch_dir}/build.log > ${test_touch_dir}/libirc.log \; [ $$? -eq 1 ]
|
|
COMMAND ${CMAKE_COMMAND} -E touch ${test_touch_dir}/.success
|
|
DEPENDS ${ldeps}
|
|
)
|
|
endmacro()
|
|
if(${WINDOWS})
|
|
test_touch_recipe(test-touch-mt)
|
|
test_touch_recipe(test-touch-md)
|
|
else()
|
|
test_touch_recipe(test-touch-rt)
|
|
endif()
|
|
|
|
# test-relo
|
|
add_custom_target(libiomp-test-relo DEPENDS test-relo/.success)
|
|
add_custom_command(
|
|
OUTPUT test-relo/.success
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory ${build_dir}/test-relo
|
|
COMMAND readelf -d ${build_dir}/${lib_file} > test-relo/readelf.log
|
|
COMMAND grep -e TEXTREL test-relo/readelf.log \; [ $$? -eq 1 ]
|
|
COMMAND ${CMAKE_COMMAND} -E touch test-relo/.success
|
|
DEPENDS lib
|
|
)
|
|
|
|
# test-execstack
|
|
add_custom_target(libiomp-test-execstack DEPENDS test-execstack/.success)
|
|
add_custom_command(
|
|
OUTPUT test-execstack/.success
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory ${build_dir}/test-execstack
|
|
COMMAND ${PERL_EXECUTABLE} ${tools_dir}/check-execstack.pl ${oa_opts} ${build_dir}/${lib_file}
|
|
COMMAND ${CMAKE_COMMAND} -E touch test-execstack/.success
|
|
DEPENDS lib
|
|
)
|
|
|
|
# test-instr
|
|
add_custom_target(libiomp-test-instr DEPENDS test-instr/.success)
|
|
add_custom_command(
|
|
OUTPUT test-instr/.success
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory ${build_dir}/test-instr
|
|
COMMAND ${PERL_EXECUTABLE} ${tools_dir}/check-instruction-set.pl ${oa_opts} --show --mic-arch=${mic_arch} ${build_dir}/${lib_file}
|
|
COMMAND ${CMAKE_COMMAND} -E touch test-instr/.success
|
|
DEPENDS lib ${tools_dir}/check-instruction-set.pl
|
|
)
|
|
|
|
# test-deps
|
|
add_custom_target(libiomp-test-deps DEPENDS test-deps/.success)
|
|
set(td_exp)
|
|
if(${FREEBSD})
|
|
set(td_exp libc.so.7 libthr.so.3 libunwind.so.5)
|
|
elseif(${MAC})
|
|
set(td_exp /usr/lib/libSystem.B.dylib)
|
|
elseif(${WINDOWS})
|
|
set(td_exp kernel32.dll)
|
|
elseif(${LINUX})
|
|
if(${MIC})
|
|
set(td_exp libc.so.6,libpthread.so.0,libdl.so.2)
|
|
if(${STD_CPP_LIB})
|
|
set(td_exp ${td_exp},libstdc++.so.6)
|
|
endif()
|
|
if("${mic_arch}" STREQUAL "knf")
|
|
set(td_exp ${td_exp},ld-linux-l1om.so.2,libgcc_s.so.1)
|
|
elseif("${mic_arch}" STREQUAL "knc")
|
|
set(td_exp ${td_exp},ld-linux-k1om.so.2)
|
|
endif()
|
|
else()
|
|
set(td_exp libdl.so.2,libgcc_s.so.1)
|
|
if(${IA32})
|
|
set(td_exp ${td_exp},libc.so.6,ld-linux.so.2)
|
|
elseif(${INTEL64})
|
|
set(td_exp ${td_exp},libc.so.6,ld-linux-x86-64.so.2)
|
|
elseif(${ARM})
|
|
set(td_exp ${td_exp},libffi.so.6,libffi.so.5,libc.so.6,ld-linux-armhf.so.3)
|
|
elseif(${PPC64})
|
|
set(td_exp ${td_exp},libc.so.6,ld64.so.1)
|
|
endif()
|
|
if(${STD_CPP_LIB})
|
|
set(td_exp ${td_exp},libstdc++.so.6)
|
|
endif()
|
|
if(NOT ${STUBS_LIBRARY})
|
|
set(td_exp ${td_exp},libpthread.so.0)
|
|
endif()
|
|
endif()
|
|
endif()
|
|
add_custom_command(
|
|
OUTPUT test-deps/.success
|
|
COMMAND ${CMAKE_COMMAND} -E make_directory ${build_dir}/test-deps
|
|
COMMAND ${PERL_EXECUTABLE} ${tools_dir}/check-depends.pl ${oa_opts} --expected="${td_exp}" ${build_dir}/${lib_file}
|
|
COMMAND ${CMAKE_COMMAND} -E touch test-deps/.success
|
|
DEPENDS lib ${tools_dir}/check-depends.pl
|
|
)
|
|
# END OF TESTS
|
|
######################################################
|