From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from [87.239.111.99] (localhost [127.0.0.1]) by dev.tarantool.org (Postfix) with ESMTP id C0D12440F60; Tue, 13 Jan 2026 18:04:25 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 dev.tarantool.org C0D12440F60 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=tarantool.org; s=dev; t=1768316665; bh=w6ERCFoK/hPJVM8g8bC/13PkjiCyUqd2RhkPB/s74No=; h=Date:To:Cc:References:In-Reply-To:Subject:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From:Reply-To:From; b=ec4oX/LVaGMjqt+jmCMylokV9PhVbesfXJ5B0JklbYEKBunGqcG/K+cQf5Lm3awDd Qo4e3iAvkxPs3mT+edFjFPeAQ95k0amdPsX+Mwy90AHfF2mAtw9Ofjbl7bKQBsUuH8 LQc6EkoHJKD7ZgWfEwE1S+VoUzl1tWUkpy64fhvY= Received: from send126.i.mail.ru (send126.i.mail.ru [89.221.237.221]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by dev.tarantool.org (Postfix) with ESMTPS id E14FE440F60 for ; Tue, 13 Jan 2026 18:04:23 +0300 (MSK) DKIM-Filter: OpenDKIM Filter v2.11.0 dev.tarantool.org E14FE440F60 Received: by exim-smtp-7b4fb89df9-4ghnk with esmtpa (envelope-from ) id 1vffwU-00000000B5n-3AfF; Tue, 13 Jan 2026 18:04:23 +0300 Content-Type: multipart/alternative; boundary="------------EKgy80usNGPxC5WnRdgcOi25" Message-ID: <997b5837-5e1b-4fd1-a8e8-bc25d6a7a8da@tarantool.org> Date: Tue, 13 Jan 2026 18:04:22 +0300 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US To: Sergey Kaplun Cc: tarantool-patches@dev.tarantool.org References: In-Reply-To: X-Mailru-Src: smtp X-4EC0790: 10 X-7564579A: 646B95376F6C166E X-77F55803: 4F1203BC0FB41BD979975AF0D777FEBD107BEE5D12D748096A1E7AE7175041FB182A05F53808504039810C33CD74767F3DE06ABAFEAF6705E6F7D83612CAB93ECA17076F2E273502EB65DD1B55DE67CD X-7FA49CB5: FF5795518A3D127A4AD6D5ED66289B5278DA827A17800CE7F0ABDA2F087648F5EA1F7E6F0F101C67BD4B6F7A4D31EC0BCC500DACC3FED6E28638F802B75D45FF8AA50765F7900637AC83A81C8FD4AD23D82A6BABE6F325AC2E85FA5F3EDFCBAA7353EFBB55337566DDAE7ACB9D63E4C434CABC31EC97E09E663FD79DB455907DF34C29A97EAD4976389733CBF5DBD5E913377AFFFEAFD269176DF2183F8FC7C07E7E81EEA8A9722B8941B15DA834481FCF19DD082D7633A0EF3E4896CB9E6436389733CBF5DBD5E9D5E8D9A59859A8B64854413538E1713FCC7F00164DA146DA6F5DAA56C3B73B237318B6A418E8EAB8D32BA5DBAC0009BE9E8FC8737B5C2249F9DC411BAB40BC2F3AA81AA40904B5D9CF19DD082D7633A0C84D3B47A649675F3AA81AA40904B5D98AA50765F79006379DD311E1DEFE6DAFEC76A7562686271ED91E3A1F190DE8FD2E808ACE2090B5E14AD6D5ED66289B5259CC434672EE63711DD303D21008E298D5E8D9A59859A8B6B372FE9A2E580EFC725E5C173C3A84C321259270BBF67A2035872C767BF85DA2F004C90652538430E4A6367B16DE6309 X-C1DE0DAB: 0D63561A33F958A54437D6DC72DB844E5002B1117B3ED6966EF60B786CC602F5ED71F038FC046993823CB91A9FED034534781492E4B8EEAD2B25D9E4C92BC8ACBDAD6C7F3747799A X-C8649E89: 1C3962B70DF3F0AD73CAD6646DEDE191716CD42B3DD1D34CAB70F9BE574AE9C625B6776AC983F447FC0B9F89525902EE6F57B2FD27647F25E66C117BDB76D659FB969B6918D7340A1E9F61350EA7FD3A347B36742D8E174C45A202B294B9B11DDCAB4A5D2D0A9103B8341EE9D5BE9A0A863723371AE9F96702CF116C1E668A241F089FA2F9063A4A8CD93680B12512CF4C41F94D744909CE2512F26BEC029E55448553D2254B8D95CD72808BE417F3B9E0E7457915DAA85F X-D57D3AED: 3ZO7eAau8CL7WIMRKs4sN3D3tLDjz0dLbV79QFUyzQ2Ujvy7cMT6pYYqY16iZVKkSc3dCLJ7zSJH7+u4VD18S7Vl4ZUrpaVfd2+vE6kuoey4m4VkSEu53w8ahmwBjZKM/YPHZyZHvz5uv+WouB9+ObcCpyrx6l7KImUglyhkEat/+ysWwi0gdhEs0JGjl6ggRWTy1haxBpVdbIX1nthFXMZebaIdHP2ghjoIc/363UZI6Kf1ptIMVVt0N+pdRHOZdOltTUvIb7M= X-Mailru-Sender: 811C44EDE0507D1FFB106D83BFFB684F32D4CA53B828DEE70D8E165B5AC4796CC1C41BB26E58270C0C717E6341E66464645D15D82EE4B272BD6E4642A116CA93524AA66B5ACBE6721EF430B9A63E2A504198E0F3ECE9B5443453F38A29522196 X-Mras: Ok Subject: Re: [Tarantool-patches] [PATCH v2 luajit 37/41] perf: add CMake infrastructure X-BeenThere: tarantool-patches@dev.tarantool.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: Tarantool development patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Sergey Bronnikov via Tarantool-patches Reply-To: Sergey Bronnikov Errors-To: tarantool-patches-bounces@dev.tarantool.org Sender: "Tarantool-patches" This is a multi-part message in MIME format. --------------EKgy80usNGPxC5WnRdgcOi25 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Hi, Sergey! thanks for the patch! LGTM in general, see my comments below. Sergey On 12/26/25 12:18, Sergey Kaplun wrote: > This commit introduces CMake building scripts for the benches introduced > before. The benchmarks are enabled only if `LUAJIT_ENABLE_PERF` option > is set. For each suite (LuaJIT-benches in this patch set) > `AddBenchTarget()` macro generates 2 targets: > * Target to run all benches and store results in the > perf/output/ directory. > * Target to run all benches via CTest and inspect results in the > console. > > For the LuaJIT-benches there are 2 generated files: > * FASTA_5000000 -- is used as an input for and > . > * SUMCOLL_5000.txt -- is used as an input for . > > These files and directory are added to the .gitignore files. > --- > .gitignore | 5 ++ > CMakeLists.txt | 11 ++++ > perf/CMakeLists.txt | 99 ++++++++++++++++++++++++++++++ > perf/LuaJIT-benches/CMakeLists.txt | 52 ++++++++++++++++ > 4 files changed, 167 insertions(+) > create mode 100644 perf/CMakeLists.txt > create mode 100644 perf/LuaJIT-benches/CMakeLists.txt > > diff --git a/.gitignore b/.gitignore > index c26a7eb8..bfc7d401 100644 > --- a/.gitignore > +++ b/.gitignore > @@ -28,3 +28,8 @@ luajit-parse-memprof > luajit-parse-sysprof > luajit.pc > *.c_test > + > +# Generated by the performance tests. > +FASTA_5000000 > +SUMCOL_5000.txt > +perf/output/ > diff --git a/CMakeLists.txt b/CMakeLists.txt > index c0da4362..73f46835 100644 > --- a/CMakeLists.txt > +++ b/CMakeLists.txt > @@ -464,6 +464,17 @@ if(LUAJIT_USE_TEST) > endif() > add_subdirectory(test) > > +# --- Benchmarks source tree --------------------------------------------------- > + > +# The option to enable performance tests for the LuaJIT. > +# Disabled by default, since commonly it is used only by LuaJIT > +# developers and run in the CI with the specially set-up machine. > +option(LUAJIT_ENABLE_PERF "Generate target" OFF) > + > +if(LUAJIT_ENABLE_PERF) > + add_subdirectory(perf) > +endif() > + > # --- Misc rules --------------------------------------------------------------- > > # XXX: Implement target using the following recipe: > diff --git a/perf/CMakeLists.txt b/perf/CMakeLists.txt > new file mode 100644 > index 00000000..1c2f8e8e > --- /dev/null > +++ b/perf/CMakeLists.txt > @@ -0,0 +1,99 @@ > +# Running various bench suites against LuaJIT. > + > +include(MakeLuaPath) > + > +if(CMAKE_BUILD_TYPE STREQUAL "Debug") > + message(WARNING "LuaJIT and perf tests are built in the Debug mode. " > + "Timings may be affected.") > +endif() > + > +set(PERF_OUTPUT_DIR ${PROJECT_BINARY_DIR}/perf/output) > +file(MAKE_DIRECTORY ${PERF_OUTPUT_DIR}) > + > +# List of paths that will be used for each suite. > +make_lua_path(LUA_PATH_BENCH_BASE > + PATHS > + # Use of the bench module. > + ${CMAKE_CURRENT_SOURCE_DIR}/utils/?.lua > + # Simple usage with `jit.dump()`, etc. > + ${LUAJIT_SOURCE_DIR}/?.lua > + ${LUAJIT_BINARY_DIR}/?.lua > +) > + > +make_lua_path(LUA_CPATH > + PATHS > + # XXX: Some arches may have installed the cjson module here. > + /usr/lib64/lua/5.1/?.so > +) > + > +# Produce the pair: > +# Target to run for reporting and target to inspect from the > +# console, runnable by the CTest. > +macro(AddBenchTarget perf_suite) > + file(MAKE_DIRECTORY "${PERF_OUTPUT_DIR}/${perf_suite}/") > + message(STATUS "Add perf suite ${perf_suite}") > + add_custom_target(${perf_suite}) > + add_custom_target(${perf_suite}-console > + COMMAND ${CMAKE_CTEST_COMMAND} > + -L ${perf_suite} use long option "--label-regex" instead "-L" > + --parallel 1 > + --verbose > + --output-on-failure > + --no-tests=error > + ) > + add_dependencies(${perf_suite}-console luajit-main) > +endmacro() > + > +# Add the bench to the pair of targets created by the call above. > +macro(AddBench bench_name bench_path perf_suite LUA_PATH) > + set(bench_title "perf/${perf_suite}/${bench_name}") > + get_filename_component(bench_name_stripped ${bench_name} NAME_WE) > + set(bench_out_file > + ${PERF_OUTPUT_DIR}/${perf_suite}/${bench_name_stripped}.json > + ) > + set(bench_command "${LUAJIT_BINARY} ${bench_path}") > + if(${ARGC} GREATER 4) > + set(input_file ${ARGV4}) > + set(bench_command "${bench_command} < ${input_file}") > + endif() > + set(BENCH_FLAGS > + "--benchmark_out_format=json --benchmark_out=${bench_out_file}" Why BENCH_FLAGS is in uppercase and bench_command_flags in lower-case? What is the difference? Also, it seems these variables are unused and can be removed: @ -56,10 +58,6 @@ macro(AddBench bench_name bench_path perf_suite LUA_PATH)      set(input_file ${ARGV4})      set(bench_command "${bench_command} < ${input_file}")    endif() -  set(BENCH_FLAGS -    "--benchmark_out_format=json --benchmark_out=${bench_out_file}" -  ) -  set(bench_command_flags ${bench_command} ${BENCH_FLAGS})    separate_arguments(bench_command_separated UNIX_COMMAND ${bench_command})    add_custom_command(      COMMAND ${CMAKE_COMMAND} -E env > + ) > + set(bench_command_flags ${bench_command} ${BENCH_FLAGS}) > + separate_arguments(bench_command_separated UNIX_COMMAND ${bench_command}) > + add_custom_command( > + COMMAND ${CMAKE_COMMAND} -E env > + LUA_PATH="${LUA_PATH}" > + LUA_CPATH="${LUA_CPATH}" > + ${bench_command_separated} > + --benchmark_out_format=json > + --benchmark_out="${bench_out_file}" > + OUTPUT ${bench_out_file} > + DEPENDS luajit-main > + COMMENT > + "Running benchmark ${bench_title} saving results in ${bench_out_file}." > + ) > + add_custom_target(${bench_name} DEPENDS ${bench_out_file}) > + add_dependencies(${perf_suite} ${bench_name}) > + > + # Report in the console. > + add_test(NAME ${bench_title} > + COMMAND sh -c "${bench_command}" I propose to use find_program for shell executable, like we do in tarantool's root cmakelists.txt: --- a/perf/CMakeLists.txt +++ b/perf/CMakeLists.txt @@ -1,5 +1,7 @@  # Running various bench suites against LuaJIT. +find_program(SHELL sh) +  include(MakeLuaPath)  if(CMAKE_BUILD_TYPE STREQUAL "Debug") @@ -78,7 +80,7 @@ macro(AddBench bench_name bench_path perf_suite LUA_PATH)    # Report in the console.    add_test(NAME ${bench_title} -    COMMAND sh -c "${bench_command}" +    COMMAND ${SHELL} -c "${bench_command}"    )    set_tests_properties(${bench_title} PROPERTIES      ENVIRONMENT "LUA_PATH=${LUA_PATH}" > + ) > + set_tests_properties(${bench_title} PROPERTIES > + ENVIRONMENT "LUA_PATH=${LUA_PATH}" > + LABELS ${perf_suite} > + DEPENDS luajit-main > + ) > + unset(input_file) > +endmacro() > + > +add_subdirectory(LuaJIT-benches) > + > +add_custom_target(${PROJECT_NAME}-perf > + DEPENDS LuaJIT-benches > +) > + > +add_custom_target(${PROJECT_NAME}-perf-console > + DEPENDS LuaJIT-benches-console > +) > diff --git a/perf/LuaJIT-benches/CMakeLists.txt b/perf/LuaJIT-benches/CMakeLists.txt > new file mode 100644 > index 00000000..d9909f36 > --- /dev/null > +++ b/perf/LuaJIT-benches/CMakeLists.txt > @@ -0,0 +1,52 @@ > +set(PERF_SUITE_NAME LuaJIT-benches) > +set(LUA_BENCH_SUFFIX .lua) > + > +AddBenchTarget(${PERF_SUITE_NAME}) > + > +# Input for the k-nucleotide and revcomp benchmarks. > +set(FASTA_NAME ${CMAKE_CURRENT_BINARY_DIR}/FASTA_5000000) > +add_custom_target(FASTA_5000000 > + COMMAND ${LUAJIT_BINARY} > + ${CMAKE_CURRENT_SOURCE_DIR}/libs/fasta.lua 5000000 > ${FASTA_NAME} > + OUTPUT ${FASTA_NAME} > + DEPENDS luajit-main > + COMMENT "Generate ${FASTA_NAME}." > +) > + > +make_lua_path(LUA_PATH > + PATHS > + ${LUA_PATH_BENCH_BASE} > + ${CMAKE_CURRENT_SOURCE_DIR}/libs/?.lua > +) > + > +# Input for the benchmark. > +set(SUM_NAME ${CMAKE_CURRENT_BINARY_DIR}/SUMCOL_5000.txt) > +# Remove possibly existing file. > +file(REMOVE ${SUM_NAME}) > + > +set(SUMCOL_FILE ${CMAKE_CURRENT_SOURCE_DIR}/SUMCOL_1.txt) > +file(READ ${SUMCOL_FILE} SUMCOL_CONTENT) > +foreach(_unused RANGE 4999) > + file(APPEND ${SUM_NAME} "${SUMCOL_CONTENT}") > +endforeach() > + > +file(GLOB benches "${CMAKE_CURRENT_SOURCE_DIR}/*${LUA_BENCH_SUFFIX}") > +foreach(bench_path ${benches}) > + file(RELATIVE_PATH bench_name ${CMAKE_CURRENT_SOURCE_DIR} ${bench_path}) > + set(bench_title "perf/${PERF_SUITE_NAME}/${bench_name}") > + if(bench_name MATCHES "k-nucleotide" OR bench_name MATCHES "revcomp") > + AddBench(${bench_name} > + ${bench_path} ${PERF_SUITE_NAME} "${LUA_PATH}" ${FASTA_NAME} > + ) > + add_dependencies(${bench_name} FASTA_5000000) > + elseif(bench_name MATCHES "sum-file") > + AddBench(${bench_name} > + ${bench_path} ${PERF_SUITE_NAME} "${LUA_PATH}" ${SUM_NAME} > + ) > + else() > + AddBench(${bench_name} ${bench_path} ${PERF_SUITE_NAME} "${LUA_PATH}") > + endif() > +endforeach() > + > +# We need to generate the file before we run tests. > +add_dependencies(${PERF_SUITE_NAME}-console FASTA_5000000) > --------------EKgy80usNGPxC5WnRdgcOi25 Content-Type: text/html; charset=UTF-8 Content-Transfer-Encoding: 8bit

Hi, Sergey!

thanks for the patch! LGTM in general, see my comments below.

Sergey

On 12/26/25 12:18, Sergey Kaplun wrote:
This commit introduces CMake building scripts for the benches introduced
before. The benchmarks are enabled only if `LUAJIT_ENABLE_PERF` option
is set. For each suite (LuaJIT-benches in this patch set)
`AddBenchTarget()` macro generates 2 targets:
* Target to run all benches and store results in the
  perf/output/<suite_name> directory.
* Target to run all benches via CTest and inspect results in the
  console.

For the LuaJIT-benches there are 2 generated files:
* FASTA_5000000 -- is used as an input for <k-nukleotide.lua> and
                   <revcomp.lua>.
* SUMCOLL_5000.txt -- is used as an input for <sum-file.lua>.

These files and <perf/output> directory are added to the .gitignore files.
---
 .gitignore                         |  5 ++
 CMakeLists.txt                     | 11 ++++
 perf/CMakeLists.txt                | 99 ++++++++++++++++++++++++++++++
 perf/LuaJIT-benches/CMakeLists.txt | 52 ++++++++++++++++
 4 files changed, 167 insertions(+)
 create mode 100644 perf/CMakeLists.txt
 create mode 100644 perf/LuaJIT-benches/CMakeLists.txt

diff --git a/.gitignore b/.gitignore
index c26a7eb8..bfc7d401 100644
--- a/.gitignore
+++ b/.gitignore
@@ -28,3 +28,8 @@ luajit-parse-memprof
 luajit-parse-sysprof
 luajit.pc
 *.c_test
+
+# Generated by the performance tests.
+FASTA_5000000
+SUMCOL_5000.txt
+perf/output/
diff --git a/CMakeLists.txt b/CMakeLists.txt
index c0da4362..73f46835 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -464,6 +464,17 @@ if(LUAJIT_USE_TEST)
 endif()
 add_subdirectory(test)
 
+# --- Benchmarks source tree ---------------------------------------------------
+
+# The option to enable performance tests for the LuaJIT.
+# Disabled by default, since commonly it is used only by LuaJIT
+# developers and run in the CI with the specially set-up machine.
+option(LUAJIT_ENABLE_PERF "Generate <perf> target" OFF)
+
+if(LUAJIT_ENABLE_PERF)
+  add_subdirectory(perf)
+endif()
+
 # --- Misc rules ---------------------------------------------------------------
 
 # XXX: Implement <uninstall> target using the following recipe:
diff --git a/perf/CMakeLists.txt b/perf/CMakeLists.txt
new file mode 100644
index 00000000..1c2f8e8e
--- /dev/null
+++ b/perf/CMakeLists.txt
@@ -0,0 +1,99 @@
+# Running various bench suites against LuaJIT.
+
+include(MakeLuaPath)
+
+if(CMAKE_BUILD_TYPE STREQUAL "Debug")
+  message(WARNING "LuaJIT and perf tests are built in the Debug mode. "
+                  "Timings may be affected.")
+endif()
+
+set(PERF_OUTPUT_DIR ${PROJECT_BINARY_DIR}/perf/output)
+file(MAKE_DIRECTORY ${PERF_OUTPUT_DIR})
+
+# List of paths that will be used for each suite.
+make_lua_path(LUA_PATH_BENCH_BASE
+  PATHS
+    # Use of the bench module.
+    ${CMAKE_CURRENT_SOURCE_DIR}/utils/?.lua
+    # Simple usage with `jit.dump()`, etc.
+    ${LUAJIT_SOURCE_DIR}/?.lua
+    ${LUAJIT_BINARY_DIR}/?.lua
+)
+
+make_lua_path(LUA_CPATH
+  PATHS
+    # XXX: Some arches may have installed the cjson module here.
+    /usr/lib64/lua/5.1/?.so
+)
+
+# Produce the pair:
+# Target to run for reporting and target to inspect from the
+# console, runnable by the CTest.
+macro(AddBenchTarget perf_suite)
+  file(MAKE_DIRECTORY "${PERF_OUTPUT_DIR}/${perf_suite}/")
+  message(STATUS "Add perf suite ${perf_suite}")
+  add_custom_target(${perf_suite})
+  add_custom_target(${perf_suite}-console
+    COMMAND ${CMAKE_CTEST_COMMAND}
+      -L ${perf_suite}
use long option "--label-regex" instead "-L"
+      --parallel 1
+      --verbose
+      --output-on-failure
+      --no-tests=error
+  )
+  add_dependencies(${perf_suite}-console luajit-main)
+endmacro()
+
+# Add the bench to the pair of targets created by the call above.
+macro(AddBench bench_name bench_path perf_suite LUA_PATH)
+  set(bench_title "perf/${perf_suite}/${bench_name}")
+  get_filename_component(bench_name_stripped  ${bench_name} NAME_WE)
+  set(bench_out_file
+    ${PERF_OUTPUT_DIR}/${perf_suite}/${bench_name_stripped}.json
+  )
+  set(bench_command "${LUAJIT_BINARY} ${bench_path}")
+  if(${ARGC} GREATER 4)
+    set(input_file ${ARGV4})
+    set(bench_command "${bench_command} < ${input_file}")
+  endif()
+  set(BENCH_FLAGS
+    "--benchmark_out_format=json --benchmark_out=${bench_out_file}"

Why BENCH_FLAGS is in uppercase and bench_command_flags in lower-case?

What is the difference?

Also, it seems these variables are unused and can be removed:

@ -56,10 +58,6 @@ macro(AddBench bench_name bench_path perf_suite LUA_PATH)
     set(input_file ${ARGV4})
     set(bench_command "${bench_command} < ${input_file}")
   endif()
-  set(BENCH_FLAGS
-    "--benchmark_out_format=json --benchmark_out=${bench_out_file}"
-  )
-  set(bench_command_flags ${bench_command} ${BENCH_FLAGS})
   separate_arguments(bench_command_separated UNIX_COMMAND ${bench_command})
   add_custom_command(
     COMMAND ${CMAKE_COMMAND} -E env

+  )
+  set(bench_command_flags ${bench_command} ${BENCH_FLAGS})
+  separate_arguments(bench_command_separated UNIX_COMMAND ${bench_command})
+  add_custom_command(
+    COMMAND ${CMAKE_COMMAND} -E env
+      LUA_PATH="${LUA_PATH}"
+      LUA_CPATH="${LUA_CPATH}"
+        ${bench_command_separated}
+          --benchmark_out_format=json
+          --benchmark_out="${bench_out_file}"
+    OUTPUT ${bench_out_file}
+    DEPENDS luajit-main
+    COMMENT
+      "Running benchmark ${bench_title} saving results in ${bench_out_file}."
+  )
+  add_custom_target(${bench_name} DEPENDS ${bench_out_file})
+  add_dependencies(${perf_suite} ${bench_name})
+
+  # Report in the console.
+  add_test(NAME ${bench_title}
+    COMMAND sh -c "${bench_command}"

I propose to use find_program for shell executable, like we do in tarantool's root cmakelists.txt:

--- a/perf/CMakeLists.txt
+++ b/perf/CMakeLists.txt
@@ -1,5 +1,7 @@
 # Running various bench suites against LuaJIT.
 
+find_program(SHELL sh)
+
 include(MakeLuaPath)
 
 if(CMAKE_BUILD_TYPE STREQUAL "Debug")
@@ -78,7 +80,7 @@ macro(AddBench bench_name bench_path perf_suite LUA_PATH)
 
   # Report in the console.
   add_test(NAME ${bench_title}
-    COMMAND sh -c "${bench_command}"
+    COMMAND ${SHELL} -c "${bench_command}"
   )
   set_tests_properties(${bench_title} PROPERTIES
     ENVIRONMENT "LUA_PATH=${LUA_PATH}"

+  )
+  set_tests_properties(${bench_title} PROPERTIES
+    ENVIRONMENT "LUA_PATH=${LUA_PATH}"
+    LABELS ${perf_suite}
+    DEPENDS luajit-main
+  )
+  unset(input_file)
+endmacro()
+
+add_subdirectory(LuaJIT-benches)
+
+add_custom_target(${PROJECT_NAME}-perf
+  DEPENDS LuaJIT-benches
+)
+
+add_custom_target(${PROJECT_NAME}-perf-console
+  DEPENDS LuaJIT-benches-console
+)
diff --git a/perf/LuaJIT-benches/CMakeLists.txt b/perf/LuaJIT-benches/CMakeLists.txt
new file mode 100644
index 00000000..d9909f36
--- /dev/null
+++ b/perf/LuaJIT-benches/CMakeLists.txt
@@ -0,0 +1,52 @@
+set(PERF_SUITE_NAME LuaJIT-benches)
+set(LUA_BENCH_SUFFIX .lua)
+
+AddBenchTarget(${PERF_SUITE_NAME})
+
+# Input for the k-nucleotide and revcomp benchmarks.
+set(FASTA_NAME ${CMAKE_CURRENT_BINARY_DIR}/FASTA_5000000)
+add_custom_target(FASTA_5000000
+  COMMAND ${LUAJIT_BINARY}
+    ${CMAKE_CURRENT_SOURCE_DIR}/libs/fasta.lua 5000000 > ${FASTA_NAME}
+  OUTPUT ${FASTA_NAME}
+  DEPENDS luajit-main
+  COMMENT "Generate ${FASTA_NAME}."
+)
+
+make_lua_path(LUA_PATH
+  PATHS
+    ${LUA_PATH_BENCH_BASE}
+    ${CMAKE_CURRENT_SOURCE_DIR}/libs/?.lua
+)
+
+# Input for the <sum-file.lua> benchmark.
+set(SUM_NAME ${CMAKE_CURRENT_BINARY_DIR}/SUMCOL_5000.txt)
+# Remove possibly existing file.
+file(REMOVE ${SUM_NAME})
+
+set(SUMCOL_FILE ${CMAKE_CURRENT_SOURCE_DIR}/SUMCOL_1.txt)
+file(READ ${SUMCOL_FILE} SUMCOL_CONTENT)
+foreach(_unused RANGE 4999)
+  file(APPEND ${SUM_NAME} "${SUMCOL_CONTENT}")
+endforeach()
+
+file(GLOB benches "${CMAKE_CURRENT_SOURCE_DIR}/*${LUA_BENCH_SUFFIX}")
+foreach(bench_path ${benches})
+  file(RELATIVE_PATH bench_name ${CMAKE_CURRENT_SOURCE_DIR} ${bench_path})
+  set(bench_title "perf/${PERF_SUITE_NAME}/${bench_name}")
+  if(bench_name MATCHES "k-nucleotide" OR bench_name MATCHES "revcomp")
+    AddBench(${bench_name}
+      ${bench_path} ${PERF_SUITE_NAME} "${LUA_PATH}" ${FASTA_NAME}
+    )
+    add_dependencies(${bench_name} FASTA_5000000)
+  elseif(bench_name MATCHES "sum-file")
+    AddBench(${bench_name}
+      ${bench_path} ${PERF_SUITE_NAME} "${LUA_PATH}" ${SUM_NAME}
+    )
+  else()
+    AddBench(${bench_name} ${bench_path} ${PERF_SUITE_NAME} "${LUA_PATH}")
+  endif()
+endforeach()
+
+# We need to generate the file before we run tests.
+add_dependencies(${PERF_SUITE_NAME}-console FASTA_5000000)

--------------EKgy80usNGPxC5WnRdgcOi25--