<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>