Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@
*.hepmc3
.DS_Store
test*
.cache
6 changes: 6 additions & 0 deletions cjetreconstruction/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
*.d
*.dSYM
*.out
*.json
build
results/
27 changes: 27 additions & 0 deletions cjetreconstruction/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
# CMake file for benchmark and validation of JetReconstruction.jl C-bindings
#
# (C) CERN, 2025
# MIT License

cmake_minimum_required(VERSION 3.12)
project(JetReconstructionBenchmarks)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")

find_package(HepMC3 REQUIRED)
find_package(JetReconstruction REQUIRED)
find_package(Julia REQUIRED) # Find Julia for GC utilities

set(CMAKE_CXX_STANDARD 17)

# JetReconstruction.jl C-bindings executable runs reconstruction then outputs either
# exclusive or inclusive jets
add_executable(cjetreconstruction-finder
src/cjetreconstruction-finder.cc
src/cjetreconstruction-utils.cc
)

target_include_directories(cjetreconstruction-finder PRIVATE ${Julia_INCLUDE_DIRS})
target_link_libraries(cjetreconstruction-finder
HepMC3::HepMC3
JetReconstruction::JetReconstruction ${Julia_LIBRARY}
)
24 changes: 24 additions & 0 deletions cjetreconstruction/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# JetReconstruction.jl C-bindings Test Applications

Benchmark application using the JetReconstruction.jl statically compiled to a shared library.

## Compilation

Configure and compile using CMake in the standard way, e.g.,

```sh
cmake -S . -B build
# or if libjectreconstruction is installed in non-standard location
# JetReconstruction_DIR=<JetReconstruction-installation-location> cmake -S . -B build
cmake --build build
```

> [!NOTE]
> Make sure to find the same version of Julia that was used to compile the JetReconstruction package.
> Custom search path can be set with `Julia_ROOT`, for instance:
>
> ```sh
> Julia_ROOT=${HOME}/.julia/juliaup/julia-1.12/ cmake -S . -B build
> ```
>
> Also make sure that for Julia 1.12 at least GLIBCXX_3.4.30 (gcc 12.1.0) is used.
185 changes: 185 additions & 0 deletions cjetreconstruction/cmake/FindJulia.cmake
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
# File taken from JuliaInteroplibcxxwrap-julia v0.13.4
# MIT License
# Copyright (c) 2015: Bart Janssens

# Original FindJulia.cmake from https://github.com/QuantStack/xtensor-julia-cookiecutter/blob/master/%7B%7Bcookiecutter.github_project_name%7D%7D/cmake/FindJulia.cmake

if(Julia_FOUND)
return()
endif()

####################
# Julia Executable #
####################

if(Julia_PREFIX)
message(STATUS "Adding path ${Julia_PREFIX} to search path")
list(APPEND CMAKE_PREFIX_PATH ${Julia_PREFIX})
message(STATUS "THIS BRANCH")
else()
find_program(Julia_EXECUTABLE julia DOC "Julia executable")
message(STATUS "Found Julia executable: " ${Julia_EXECUTABLE})
endif()

#################
# Julia Version #
#################

if(Julia_EXECUTABLE)
execute_process(
COMMAND "${Julia_EXECUTABLE}" --startup-file=no --version
OUTPUT_VARIABLE Julia_VERSION_STRING
)
else()
find_file(Julia_VERSION_INCLUDE julia_version.h PATH_SUFFIXES include/julia)
file(READ ${Julia_VERSION_INCLUDE} Julia_VERSION_STRING)
string(REGEX MATCH "JULIA_VERSION_STRING.*" Julia_VERSION_STRING ${Julia_VERSION_STRING})
endif()

string(
REGEX REPLACE ".*([0-9]+\\.[0-9]+\\.[0-9]+).*" "\\1"
Julia_VERSION_STRING "${Julia_VERSION_STRING}"
)

MESSAGE(STATUS "Julia_VERSION_STRING: ${Julia_VERSION_STRING}")

##################
# Julia Includes #
##################

set(JULIA_HOME_NAME "Sys.BINDIR")
if(${Julia_VERSION_STRING} VERSION_LESS "0.7.0")
set(JULIA_HOME_NAME "JULIA_HOME")
else()
set(USING_LIBDL "using Libdl")
endif()

if(DEFINED ENV{JULIA_INCLUDE_DIRS})
set(Julia_INCLUDE_DIRS $ENV{JULIA_INCLUDE_DIRS}
CACHE STRING "Location of Julia include files")
elseif(Julia_EXECUTABLE)
execute_process(
COMMAND ${Julia_EXECUTABLE} --startup-file=no -E "julia_include_dir = joinpath(match(r\"(.*)(bin)\",${JULIA_HOME_NAME}).captures[1],\"include\",\"julia\")\n
if !isdir(julia_include_dir) # then we're running directly from build\n
julia_base_dir_aux = splitdir(splitdir(${JULIA_HOME_NAME})[1])[1] # useful for running-from-build\n
julia_include_dir = joinpath(julia_base_dir_aux, \"usr\", \"include\" )\n
julia_include_dir *= \";\" * joinpath(julia_base_dir_aux, \"src\", \"support\" )\n
julia_include_dir *= \";\" * joinpath(julia_base_dir_aux, \"src\" )\n
end\n
julia_include_dir"
OUTPUT_VARIABLE Julia_INCLUDE_DIRS
)

string(REGEX REPLACE "\"" "" Julia_INCLUDE_DIRS "${Julia_INCLUDE_DIRS}")
string(REGEX REPLACE "\n" "" Julia_INCLUDE_DIRS "${Julia_INCLUDE_DIRS}")
set(Julia_INCLUDE_DIRS ${Julia_INCLUDE_DIRS}
CACHE PATH "Location of Julia include files")
elseif(Julia_PREFIX)
set(Julia_INCLUDE_DIRS ${Julia_PREFIX}/include/julia)
endif()
set(Julia_INCLUDE_DIRS ${Julia_INCLUDE_DIRS};$ENV{includedir})
MESSAGE(STATUS "Julia_INCLUDE_DIRS: ${Julia_INCLUDE_DIRS}")

###################
# Julia Libraries #
###################

if(WIN32)
set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES} .a;.dll)
endif()

if(Julia_EXECUTABLE)
execute_process(
COMMAND ${Julia_EXECUTABLE} --startup-file=no -E "${USING_LIBDL}\nabspath(Libdl.dlpath((ccall(:jl_is_debugbuild, Cint, ()) != 0) ? \"libjulia-debug\" : \"libjulia\"))"
OUTPUT_VARIABLE Julia_LIBRARY
)

string(REGEX REPLACE "\"" "" Julia_LIBRARY "${Julia_LIBRARY}")
string(REGEX REPLACE "\n" "" Julia_LIBRARY "${Julia_LIBRARY}")
string(STRIP "${Julia_LIBRARY}" Julia_LIBRARY)

if(WIN32)
get_filename_component(Julia_LIBRARY_DIR ${Julia_LIBRARY} DIRECTORY)
get_filename_component(Julia_LIBRARY_DIR ${Julia_LIBRARY_DIR} DIRECTORY)
find_library(win_Julia_LIBRARY
NAMES libjulia.dll.a
PATHS "${Julia_LIBRARY_DIR}/lib"
NO_DEFAULT_PATH
)
set(Julia_LIBRARY "${win_Julia_LIBRARY}")
endif()

set(Julia_LIBRARY "${Julia_LIBRARY}"
CACHE PATH "Julia library")
else()
find_library(Julia_LIBRARY NAMES libjulia.${Julia_VERSION_STRING}.dylib julia libjulia.dll.a libjulia CMAKE_FIND_ROOT_PATH_BOTH)
endif()

get_filename_component(Julia_LIBRARY_DIR ${Julia_LIBRARY} DIRECTORY)

MESSAGE(STATUS "Julia_LIBRARY_DIR: ${Julia_LIBRARY_DIR}")
MESSAGE(STATUS "Julia_LIBRARY: ${Julia_LIBRARY}")

##############
# JULIA_HOME #
##############

if(Julia_EXECUTABLE)
execute_process(
COMMAND ${Julia_EXECUTABLE} --startup-file=no -E "${JULIA_HOME_NAME}"
OUTPUT_VARIABLE JULIA_HOME
)

string(REGEX REPLACE "\"" "" JULIA_HOME "${JULIA_HOME}")
string(REGEX REPLACE "\n" "" JULIA_HOME "${JULIA_HOME}")

MESSAGE(STATUS "JULIA_HOME: ${JULIA_HOME}")

###################
# libLLVM version #
###################

execute_process(
COMMAND ${Julia_EXECUTABLE} --startup-file=no -E "Base.libllvm_version"
OUTPUT_VARIABLE Julia_LLVM_VERSION
)

string(REGEX REPLACE "\"" "" Julia_LLVM_VERSION "${Julia_LLVM_VERSION}")
string(REGEX REPLACE "\n" "" Julia_LLVM_VERSION "${Julia_LLVM_VERSION}")

MESSAGE(STATUS "Julia_LLVM_VERSION: ${Julia_LLVM_VERSION}")
endif()

##################################
# Check for Existence of Headers #
##################################

find_path(Julia_MAIN_HEADER julia.h HINTS ${Julia_INCLUDE_DIRS})

#######################################
# Determine if we are on 32 or 64 bit #
#######################################

if(Julia_EXECUTABLE)
execute_process(
COMMAND ${Julia_EXECUTABLE} --startup-file=no -E "Sys.WORD_SIZE"
OUTPUT_VARIABLE Julia_WORD_SIZE
)
string(REGEX REPLACE "\n" "" Julia_WORD_SIZE "${Julia_WORD_SIZE}")
MESSAGE(STATUS "Julia_WORD_SIZE: ${Julia_WORD_SIZE}")
endif()

if($ENV{target} MATCHES "^i686.*")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse -msse2")
endif()

###########################
# FindPackage Boilerplate #
###########################

include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(Julia
REQUIRED_VARS Julia_LIBRARY Julia_LIBRARY_DIR Julia_INCLUDE_DIRS Julia_MAIN_HEADER
VERSION_VAR Julia_VERSION_STRING
FAIL_MESSAGE "Julia not found"
)
Loading