2

The project structure is as below

├── ast
│   ├── CMakeLists.txt
│   ├── expression
│   │   ├── CMakeLists.txt
│   │   ├── Expression.cpp
│   │   ├── Expression.hpp
│   │   ├── NumericExpression.cpp
│   │   └── NumericExpression.h
│   ├── Visitor.cpp
│   └── Visitor.hpp
├── callSlang
│   ├── CMakeLists.txt
│   └── main.cpp
├── CMakeLists.txt
├── contexts
│   ├── CMakeLists.txt
│   ├── Context.hpp
│   ├── Symbol.cpp
│   ├── Symbol.hpp
│   └── SymbolTable.hpp
├── frontend
│   ├── CMakeLists.txt
│   ├── Parser.cpp
│   └── Parser.hpp
├── Makefile
├── meta
│   ├── CMakeLists.txt
│   └── Meta.hpp
└── README.md

CMakeLists.txt

cmake_minimum_required(VERSION 3.16.3)

# set the project name
# https://stackoverflow.com/questions/71740678/cmake-error-in-findterminfo-with-clang-15-on-macos
project(slangLLvm VERSION 1.0 LANGUAGES C CXX)

# specify the C++ standard
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED True)
set(CMAKE_BUILD_TYPE "Debug")


set(LLVM_DIR /usr/lib/llvm-14/lib/cmake/llvm)

find_package(LLVM REQUIRED CONFIG
             PATHS ${search_paths}
             NO_DEFAULT_PATH)



add_subdirectory(meta)
add_subdirectory(contexts)
add_subdirectory(ast)
add_subdirectory(frontend)
add_subdirectory(callSlang)

callSlang/CMakeLists.txt

set(SOURCE_FILE main.cpp)
# add the files for creating executable
add_executable(slangLLVM ${SOURCE_FILE})


#link the libs 
target_link_libraries(slangLLVM 
PRIVATE
    ast
    frontend
)

ast/CMakeLists.txt

set(SOURCE_FILES Visitor.cpp)
add_library(ast ${SOURCE_FILES})

target_link_libraries(ast 
PUBLIC 
    meta
    contexts
    LLVMSupport
    expression
PRIVATE
    frontend
)

    
# get the include dirs 
target_include_directories(ast 
INTERFACE  
    .
PUBLIC
    ${LLVM_INCLUDE_DIRS}
    ${PROJECT_SOURCE_DIR}/meta 
    ${PROJECT_SOURCE_DIR}/ast/expression
    
)

add_subdirectory(expression)

expression/CMakeLists.txt

set(SOURCE_FILES Expression.cpp NumericExpression.cpp)
add_library(experssion ${SOURCE_FILES})


target_link_libraries(experssion
PUBLIC
    ast
)
    
# get the include dirs 
target_include_directories(experssion 
INTERFACE  
    .
PUBLIC 
    ${LLVM_INCLUDE_DIRS}
    ${PROJECT_SOURCE_DIR}/contexts
    ${PROJECT_SOURCE_DIR}/ast 
    ${PROJECT_SOURCE_DIR}/meta

)

# INTERFACE tells to use includes to other libs but on the ast

frontend/CMakeLists.txt


set(SOURCE_FILES Parser.cpp)

add_library(frontend STATIC ${SOURCE_FILES})

target_link_libraries(frontend 
PRIVATE 
    ast 
)

# get the include dirs 
target_include_directories(frontend 
INTERFACE 
    .
PRIVATE
    ${PROJECT_BINARY_DIR}
    ${PROJECT_SOURCE_DIR}/ast
    ${PROJECT_SOURCE_DIR}/contexts
    ${PROJECT_SOURCE_DIR}/ast/expression
)

meta/CMakeLists.txt

add_library(meta INTERFACE)    
# get the include dirs 
target_include_directories(meta INTERFACE .)

This compiles without error but fails during linking with the following error

[100%] Linking CXX executable slangLLVM
/usr/bin/ld: cannot find -lexpression
collect2: error: ld returned 1 exit status
make[3]: *** [callSlang/CMakeFiles/slangLLVM.dir/build.make:93: callSlang/slangLLVM] Error 1
make[3]: Leaving directory '/home/nithin/learn/c-cpp/slang-llvm/build'
make[2]: *** [CMakeFiles/Makefile2:392: callSlang/CMakeFiles/slangLLVM.dir/all] Error 2
make[2]: Leaving directory '/home/nithin/learn/c-cpp/slang-llvm/build'
make[1]: *** [Makefile:84: all] Error 2
make[1]: Leaving directory '/home/nithin/learn/c-cpp/slang-llvm/build'
make: *** [Makefile:4: all] Error 2

CallSlang depends on ast, ast depends on the expression and vice versa.

I have tried the solution in the link but it not-working so far for me. I am really new to CMake. Is it caused by the circular call by ast and expression, if so how can correct the same? The complete code can be found in this link

Could someone please tell me the possible cause and solution? If I've missed out anything, over- or under-emphasized a specific point, please let me know in the comments. Thank you so much in advance for your time.

Nithin Varghese
  • 893
  • 1
  • 6
  • 28
  • @273K Are u suggesting in ast/CMakeLists.txt? If so I have tried it out and getting the same error. – Nithin Varghese Aug 18 '22 at 01:50
  • 2
    Your library target is called `experssion` but your project links to `expression`. Fix your typo and it should work. – vre Aug 18 '22 at 05:45
  • @273K: CMake perfectly allows to use `target_link_libraries` for link with targets which are not created yet, so order between `target_link_libraries` and `add_subdirectory` is not important. Only the very first argument to `target_link_libraries` should denote an already existed target. – Tsyvarev Aug 18 '22 at 07:35

0 Answers0