<div dir="ltr">Hi,<div><br></div><div>I'm not opposed to this, but I'll let Matthias do the real review as he's been working most in this area recently.</div><div><br></div><div>James</div></div><br><div class="gmail_quote"><div dir="ltr">On Thu, 12 May 2016 at 23:29 Artem Belevich via llvm-commits <<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">tra created this revision.<br>
tra added a reviewer: MatzeB.<br>
tra added a subscriber: llvm-commits.<br>
<br>
This patch allows various compiler options as arguments to llvm_{multi,single}source().<br>
<br>
Both now accept following optional arguments that are used in addition to<br>
those specified via CFLAGS/CXXFLAGS/CPPFLAGS/LDFLAGS variables. This<br>
allows adjusting build parameters for specific target without having to<br>
modify global variables which makes build files somewhat less verbose.<br>
<br>
In addition to global option, I've added two flags to further customize llvm<br>
test target: LIBS and DEPS. This allows more control over targets that need<br>
extra dependencies or need to link with shared libraries in non-standard directories.<br>
<br>
* CFLAGS/CXXFLAGS/CPPFLAGS -- added to COMPILE_FLAGS property<br>
* LDFLAGS -- added to LINK_LIBRARIES property<br>
* LIBS -- applies target_link_libraries() which allows cmake to<br>
pass proper flags like rpath for shared libraries.<br>
* DEPS -- applies add_dependencies()<br>
<br>
This change allows reducing amount of boilerplate for most of the simple test cases.<br>
Upcoming patch converts MultiSource/* build files to use this functionality.<br>
<br>
<a href="http://reviews.llvm.org/D20221" rel="noreferrer" target="_blank">http://reviews.llvm.org/D20221</a><br>
<br>
Files:<br>
cmake/modules/SingleMultiSource.cmake<br>
<br>
Index: cmake/modules/SingleMultiSource.cmake<br>
===================================================================<br>
--- cmake/modules/SingleMultiSource.cmake<br>
+++ cmake/modules/SingleMultiSource.cmake<br>
@@ -116,30 +116,37 @@<br>
llvm_add_test(${testfile} ${executable})<br>
endfunction()<br>
<br>
-macro(test_suite_add_executable name mainsource)<br>
- list(FIND PROGRAMS_TO_SKIP ${name} name_idx)<br>
+macro(test_suite_add_executable)<br>
+ cmake_parse_arguments(_ARG "" "PROG;MAIN" "SOURCES;CFLAGS;CPPFLAGS;CXXFLAGS;LDFLAGS;LIBS;DEPS" ${ARGN})<br>
+ list(FIND PROGRAMS_TO_SKIP ${_ARG_PROG} name_idx)<br>
# Should we skip this?<br>
if(${name_idx} EQUAL -1)<br>
- get_unique_exe_name(executable ${mainsource})<br>
- add_executable(${executable} ${ARGN})<br>
- append_compile_flags(${executable} ${CFLAGS})<br>
- append_compile_flags(${executable} ${CPPFLAGS})<br>
- append_compile_flags(${executable} ${CXXFLAGS})<br>
+ get_unique_exe_name(executable ${_ARG_MAIN})<br>
+ add_executable(${executable} ${_ARG_SOURCES})<br>
+ append_compile_flags(${executable} ${CFLAGS} ${_ARG_CFLAGS})<br>
+ append_compile_flags(${executable} ${CPPFLAGS} ${_ARG_CPPFLAGS})<br>
+ append_compile_flags(${executable} ${CXXFLAGS} ${_ARG_CXXFLAGS})<br>
# Note that we cannot use target_link_libraries() here because that one<br>
# only interprets inputs starting with '-' as flags.<br>
- append_link_flags(${executable} ${LDFLAGS})<br>
+ append_link_flags(${executable} ${LDFLAGS} ${_ARG_LDFLAGS})<br>
+ if (_ARG_LIBS)<br>
+ target_link_libraries(${executable} ${_ARG_LIBS})<br>
+ endif()<br>
set(executable_path ${CMAKE_CURRENT_BINARY_DIR}/${executable})<br>
if (TEST_SUITE_PROFILE_USE)<br>
append_compile_flags(${executable} -fprofile-instr-use=${executable_path}.profdata)<br>
append_link_flags(${executable} -fprofile-instr-use=${executable_path}.profdata)<br>
endif()<br>
+ if (${_ARG_DEPS})<br>
+ add_dependencies(${executable} ${_ARG_DEPS})<br>
+ endif()<br>
<br>
set_property(GLOBAL APPEND PROPERTY TEST_SUITE_TARGETS ${executable})<br>
<br>
# Fall back to old style involving RUN_OPTIONS and STDIN_FILENAME if<br>
# llvm_test_run() was not called yet.<br>
if(NOT TESTSCRIPT)<br>
- llvm_test_traditional(${executable_path}.test ${executable_path} ${name})<br>
+ llvm_test_traditional(${executable_path}.test ${executable_path} ${_ARG_PROG})<br>
else()<br>
llvm_add_test(${executable_path}.test ${executable_path})<br>
endif()<br>
@@ -159,24 +166,30 @@<br>
string(REGEX REPLACE ".[cp]+$" "" path ${source})<br>
string(REGEX REPLACE ".*/" "" name ${path})<br>
<br>
- test_suite_add_executable(${name} ${source} ${source})<br>
+ test_suite_add_executable(PROG "${name}" MAIN "${source}" SOURCES ${source} ${ARGN})<br>
endforeach()<br>
endmacro()<br>
<br>
# Configure the current directory as a MultiSource subdirectory - i.e. there is<br>
# one test and it consists of all sources in the directory (or a curated list,<br>
# if Source is defined).<br>
macro(llvm_multisource)<br>
- if(DEFINED Source)<br>
- set(sources ${Source})<br>
+ cmake_parse_arguments(_ARG "" "PROG" "SOURCES" ${ARGN})<br>
+ if(DEFINED Source OR _ARG_SOURCES)<br>
+ set(sources ${Source} ${_ARG_SOURCES})<br>
else()<br>
file(GLOB sources *.c *.cpp *.cc)<br>
endif()<br>
list(LENGTH sources sources_len)<br>
-<br>
- if(sources_len GREATER 0 AND DEFINED PROG)<br>
+ # PROG passed as an argument has higher precedence.<br>
+ if (_ARG_PROG)<br>
+ set(_PROG ${_ARG_PROG})<br>
+ elseif(DEFINED PROG)<br>
+ set(_PROG ${PROG})<br>
+ endif()<br>
+ if(sources_len GREATER 0 AND _PROG)<br>
include_directories(${CMAKE_CURRENT_SOURCE_DIR})<br>
include_directories(${CMAKE_CURRENT_BINARY_DIR})<br>
- test_suite_add_executable(${PROG} "${PROG}.c" ${sources})<br>
+ test_suite_add_executable(PROG ${_PROG} MAIN "${_PROG}.c" SOURCES ${sources} ${ARGN})<br>
endif()<br>
endmacro()<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</blockquote></div>