Commit d809b962 authored by Nicolas Van der Noot's avatar Nicolas Van der Noot
Browse files

clean cmake files

parent d5e76735
#
# author: Nicolas Docquier (on basis of Nicolas Van der Noot example)
# November 2014
# Authors: Nicolas Docquier, Nicolas Van der Noot, Timothee Habra
# September 2015
#
# CMake for a simple pour C robotran project
#
......@@ -9,7 +9,6 @@
# PROJECT MAIN CONFIGURATIONS
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# CMake minimum version
cmake_minimum_required(VERSION 2.8.7)
......@@ -17,31 +16,42 @@ cmake_minimum_required(VERSION 2.8.7)
project (projectRobotran)
# project configuration
set(CMAKE_C_FLAGS_RELEASE "-O3")
set(CMAKE_CXX_FLAGS_RELEASE "-O3")
set( CMAKE_C_FLAGS_RELEASE "-O3" )
set( CMAKE_CXX_FLAGS_RELEASE "-O3" )
# Variable for storing the path to Robotran common files (should be adapted depending on the location of those source)
set(ROBOTRAN_DIR_COMMON "${PROJECT_SOURCE_DIR}/../../../MBsysC/")
set(ROBOTRAN_DIR_COPY "${PROJECT_SOURCE_DIR}/../mbsysCopy/")
# change the following line with 'set(ROBOTRAN_SOURCE_DIR ${ROBOTRAN_DIR_COPY})'' to use the Standalone version
set(ROBOTRAN_SOURCE_DIR ${ROBOTRAN_DIR_COMMON})
set( ROBOTRAN_DIR_COMMON ${PROJECT_SOURCE_DIR}/../../../MBsysC/ )
set( ROBOTRAN_DIR_COPY ${PROJECT_SOURCE_DIR}/../mbsysCopy/ )
# change the following line with 'set( ROBOTRAN_SOURCE_DIR ${ROBOTRAN_DIR_COPY} )'' to use the Standalone version
set( ROBOTRAN_SOURCE_DIR ${ROBOTRAN_DIR_COMMON} )
# message to display the project name
message(STATUS "Processing ${PROJECT_NAME}")
# for Unix: display all the warnings, except the ones related to /* -- */ and for the unused variables
if (UNIX)
set(CMAKE_C_FLAGS "-g -Wall -Wno-unused-but-set-variable -Wno-unused-variable -Wno-comment")
set( CMAKE_C_FLAGS "-g -Wall -Wno-unused-but-set-variable -Wno-unused-variable -Wno-comment" )
# remove some compilation warnings (This line should be removed once the loading, equil and modal modules are stabilized)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-uninitialized -Wno-unused-result -Wno-maybe-uninitialized")
set( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-uninitialized -Wno-unused-result -Wno-maybe-uninitialized" )
endif ( )
# add additional CMakeLists.txt files
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# Additional CMakelists.txt
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# additional CMake functions
set(CMAKE_AUX ${ROBOTRAN_SOURCE_DIR}/cmake_aux)
set(CMAKE_AUX_BIN ${PROJECT_BINARY_DIR}/cmake_aux)
add_subdirectory (${CMAKE_AUX}/flags/ ${CMAKE_AUX_BIN}/flags/)
add_subdirectory (${CMAKE_AUX}/listing/ ${CMAKE_AUX_BIN}/listing/)
add_subdirectory (${CMAKE_AUX}/libraries/ ${CMAKE_AUX_BIN}/libraries/)
add_subdirectory ( ${CMAKE_AUX}/flags/ ${CMAKE_AUX_BIN}/flags/ )
add_subdirectory ( ${CMAKE_AUX}/listing/ ${CMAKE_AUX_BIN}/listing/ )
add_subdirectory ( ${CMAKE_AUX}/libraries/ ${CMAKE_AUX_BIN}/libraries/ )
# MBsysC files to compile
if (NOT FLAG_SEPARATE_BUILD)
add_subdirectory( ${ROBOTRAN_SOURCE_DIR}/mbs_common ${CMAKE_CURRENT_BINARY_DIR}/mbs_common )
endif ( )
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
......@@ -56,7 +66,6 @@ release_debug()
definitions()
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# USER ABSOLUTE PATHS
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
......@@ -70,18 +79,16 @@ configure_file (
include_directories (${PROJECT_BINARY_DIR}/conf)
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# LIST FILES
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# list source files to compile
init_src()
increment_src("${PROJECT_SOURCE_DIR}/src")
increment_src("${PROJECT_SOURCE_DIR}/../userfctR")
increment_src("${PROJECT_SOURCE_DIR}/../symbolicR")
increment_src( ${PROJECT_SOURCE_DIR}/src )
increment_src( ${PROJECT_SOURCE_DIR}/../userfctR )
increment_src( ${PROJECT_SOURCE_DIR}/../symbolicR )
increment_void_symbolic(symbolicR)
......@@ -89,9 +96,8 @@ increment_void_symbolic(symbolicR)
# list include directories (to find headers)
init_include()
increment_include("${PROJECT_SOURCE_DIR}/..")
increment_include("${ROBOTRAN_SOURCE_DIR}")
increment_include( ${PROJECT_SOURCE_DIR}/.. )
increment_include( ${ROBOTRAN_SOURCE_DIR} )
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
......@@ -100,9 +106,9 @@ increment_include("${ROBOTRAN_SOURCE_DIR}")
## --- WIN32 or WIN64 DETECTION --- ##
if( CMAKE_SIZEOF_VOID_P EQUAL 8 ) # 64bit windows
if( CMAKE_SIZEOF_VOID_P EQUAL 8 ) # 64bit Windows
SET(WIN_LIB_DIRECTORY win64_include_lib)
else( CMAKE_SIZEOF_VOID_P EQUAL 8 ) # 32bit windows
else( ) # 32bit Windows
SET(WIN_LIB_DIRECTORY win32_include_lib)
endif( )
......@@ -117,58 +123,54 @@ endif ( )
set(CMAKE_MODULE_PATH ${ROBOTRAN_SOURCE_DIR}/conf)
# GSL
gsl_lib(project)
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# CONFIGURE EXECUTABLE
# EXECUTABLE COMPILATION
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# include these directories
include_directories (${INCLUDE_DIR})
# name of the executable
set (Executable exe_${PROJECT_NAME})
set ( Executable exe_${PROJECT_NAME} )
# generate the executable
add_executable (${Executable} ${SOURCE_FILES})
add_executable ( ${Executable} ${SOURCE_FILES} )
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# EXECUTABLE LINKING
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
if (FLAG_VISU)
include_directories(${JNI_INCLUDE_PATH})
endif (FLAG_VISU)
if (FLAG_SEPARATE_BUILD) # find MBSysC dynamic libraries
find_package( LibRobotranC REQUIRED )
target_link_libraries( ${Executable} ${LIB_MBSYSC_MODULES} ${LIB_MBSYSC_LOAD} ${LIB_MBSYSC_UTILITIES} )
else ( ) # find MBSysC static libraries
target_link_libraries( ${Executable} MBsysC_loadXML MBsysC_module )
# math external library (for Unix): linkage
if (NOT FLAG_SHARED_LIB)
target_link_libraries( ${Executable} MBsysC_struct MBsysC_numerics MBsysC_utilities MBsysC_realtime )
endif ( )
endif ( )
# math external library (for Unix)
if (UNIX)
target_link_libraries (${Executable} m)
target_link_libraries ( ${Executable} m )
endif ( )
#Libxml2 and GSL external libraries: linkage
target_link_libraries (${Executable} ${LIBXML2_LIBRARIES} ${GSL_LIBRARIES})
#Libxml2 and GSL external libraries
target_link_libraries ( ${Executable} ${LIBXML2_LIBRARIES} ${GSL_LIBRARIES} )
# SDL external library: linkage
# SDL external library
if (FLAG_PLOT)
target_link_libraries (${Executable} ${SDL2_LIBRARIES} ${SDL2TTF_LIBRARIES})
target_link_libraries ( ${Executable} ${SDL2_LIBRARIES} ${SDL2TTF_LIBRARIES} )
endif ( )
# Java external library: linkage
# Java external library
if (FLAG_VISU)
target_link_libraries (${Executable} ${JNI_LIBRARIES})
endif ( )
if (FLAG_SEPARATE_BUILD) # find MBSysC dynamic libraries
find_package(LibRobotranC REQUIRED)
target_link_libraries(${Executable} "${LIB_MBSYSC_MODULES}")
target_link_libraries(${Executable} "${LIB_MBSYSC_LOAD}")
target_link_libraries(${Executable} "${LIB_MBSYSC_UTILITIES}")
else ( )
add_subdirectory("${ROBOTRAN_SOURCE_DIR}/mbs_common" "${CMAKE_CURRENT_BINARY_DIR}/mbs_common")
target_link_libraries(${Executable} MBsysC_loadXML)
target_link_libraries(${Executable} MBsysC_module)
if(NOT FLAG_SHARED_LIB)
target_link_libraries(${Executable} MBsysC_struct MBsysC_numerics MBsysC_utilities MBsysC_realtime)
endif(NOT FLAG_SHARED_LIB)
target_link_libraries ( ${Executable} ${JNI_LIBRARIES} )
endif ( )
#
# Author: Nicolas Van der Noot & Timothee Habra
# September 2015
#
# Flags functions
#
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# FLAGS
......@@ -29,7 +35,6 @@ option (FLAG_SEPARATE_BUILD
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# SET FLAG VALUE
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
......@@ -39,7 +44,6 @@ function(set_flag arg0 arg1)
endfunction()
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# SAFETY: INCOMPATIBLE FLAGS
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
......
#
# Author: Nicolas Van der Noot
# September 2015
#
# Library functions
#
# Libxml2
function(xml_lib arg0)
......@@ -60,7 +66,6 @@ function(sdl_lib arg0)
set(SDL2TTF_LIBRARIES ${SDL2TTF_LIBRARIES} PARENT_SCOPE)
endfunction()
# Java
function(java_lib arg0)
find_package(JNI REQUIRED)
......@@ -84,7 +89,6 @@ function(java_lib arg0)
message(" -> PATH : ${J3D_PATH}\n")
set(JNI_INCLUDE_PATH ${JNI_INCLUDE_PATH} PARENT_SCOPE)
set(JNI_LIBRARIES ${JNI_LIBRARIES} PARENT_SCOPE)
set (J3D_PATH ${J3D_PATH} PARENT_SCOPE)
set(J3D_PATH ${J3D_PATH} PARENT_SCOPE)
endfunction()
#
# Author: Nicolas Van der Noot & Timothee Habra
# September 2015
#
# Listing functions
#
## -- SRC FILES -- ##
......@@ -41,7 +47,6 @@ function(increment_src_file arg0)
endfunction()
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
# CHECKING SYMBOLIC FILES
#
......
# Copyright: (C)
# Authors: Timothee Habra
# Authors: Timothee Habra & Nicolas Van der Noot
# CopyPolicy: Released under the terms of the LGPLv2.1 or later, see LGPL.TXT
cmake_minimum_required(VERSION 2.8.7)
......@@ -8,12 +8,11 @@ project(MBsysC)
## --------------- ##
# link to useful cmake functions
# link to useful CMake functions
set(CMAKE_AUX "${CMAKE_CURRENT_SOURCE_DIR}/../cmake_aux")
set(CMAKE_AUX_BIN ${PROJECT_BINARY_DIR}/cmake_aux)
set(CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../conf/")
add_subdirectory (${CMAKE_AUX}/listing/ ${CMAKE_AUX_BIN}/listing/)
add_subdirectory (${CMAKE_AUX}/flags/ ${CMAKE_AUX_BIN}/flags/)
add_subdirectory (${CMAKE_AUX}/libraries/ ${CMAKE_AUX_BIN}/libraries/)
......@@ -22,26 +21,28 @@ definitions()
flags_check()
## --------------- ##
# flags
if (UNIX)
set(CMAKE_C_FLAGS "-fPIC")
set(CMAKE_EXE_LINKER_FLAGS "-fPIC")
set(CMAKE_C_FLAGS "-fPIC")
set(CMAKE_EXE_LINKER_FLAGS "-fPIC")
endif (UNIX)
add_subdirectory (mbs_numerics/ ${CMAKE_CURRENT_BINARY_DIR}/mbs_numerics/)
add_subdirectory (mbs_struct/ ${CMAKE_CURRENT_BINARY_DIR}/mbs_struct/)
add_subdirectory (mbs_utilities/ ${CMAKE_CURRENT_BINARY_DIR}/mbs_utilities/)
add_subdirectory (mbs_load_xml/ ${CMAKE_CURRENT_BINARY_DIR}/mbs_load_xml/)
add_subdirectory (mbs_module/ ${CMAKE_CURRENT_BINARY_DIR}/mbs_module/)
add_subdirectory (mbs_realtime/ ${CMAKE_CURRENT_BINARY_DIR}/mbs_realtime/)
# add parent scope
set(LIBXML2_LIBRARIES ${LIBXML2_LIBRARIES} PARENT_SCOPE)
set(GSL_LIBRARIES ${GSL_LIBRARIES} PARENT_SCOPE)
set(SDL2_LIBRARIES ${SDL2_LIBRARIES} PARENT_SCOPE)
set(SDL2TTF_LIBRARIES ${SDL2TTF_LIBRARIES} PARENT_SCOPE)
set(JNI_INCLUDE_PATH ${JNI_INCLUDE_PATH} PARENT_SCOPE)
set(JNI_LIBRARIES ${JNI_LIBRARIES} PARENT_SCOPE)
set (J3D_PATH ${J3D_PATH} PARENT_SCOPE)
# add compilation CMake modules
add_subdirectory ( mbs_numerics/ ${CMAKE_CURRENT_BINARY_DIR}/mbs_numerics/ )
add_subdirectory ( mbs_struct/ ${CMAKE_CURRENT_BINARY_DIR}/mbs_struct/ )
add_subdirectory ( mbs_utilities/ ${CMAKE_CURRENT_BINARY_DIR}/mbs_utilities/ )
add_subdirectory ( mbs_load_xml/ ${CMAKE_CURRENT_BINARY_DIR}/mbs_load_xml/ )
add_subdirectory ( mbs_module/ ${CMAKE_CURRENT_BINARY_DIR}/mbs_module/ )
add_subdirectory ( mbs_realtime/ ${CMAKE_CURRENT_BINARY_DIR}/mbs_realtime/ )
# add parent scope if needed
get_directory_property(hasParent PARENT_DIRECTORY)
if(hasParent)
set( LIBXML2_LIBRARIES ${LIBXML2_LIBRARIES} PARENT_SCOPE )
set( GSL_LIBRARIES ${GSL_LIBRARIES} PARENT_SCOPE )
set( SDL2_LIBRARIES ${SDL2_LIBRARIES} PARENT_SCOPE )
set( SDL2TTF_LIBRARIES ${SDL2TTF_LIBRARIES} PARENT_SCOPE )
set( JNI_LIBRARIES ${JNI_LIBRARIES} PARENT_SCOPE )
set( J3D_PATH ${J3D_PATH} PARENT_SCOPE )
endif()
......@@ -19,12 +19,13 @@ init_include()
set(INCLUDE_DIR ${INCLUDE_DIR} "./" PARENT_SCOPE)
if(FLAG_SHARED_LIB)
add_library(MBsysC_loadXML SHARED ${SOURCE_FILES} ${INCLUDE_DIR})
target_link_libraries (MBsysC_loadXML ${LIBXML2_LIBRARIES})
else(FLAG_SHARED_LIB)
add_library(MBsysC_loadXML STATIC ${SOURCE_FILES} ${INCLUDE_DIR})
endif(FLAG_SHARED_LIB)
add_library(MBsysC_loadXML SHARED ${SOURCE_FILES} ${INCLUDE_DIR})
target_link_libraries(MBsysC_loadXML ${LIBXML2_LIBRARIES})
else( )
add_library(MBsysC_loadXML STATIC ${SOURCE_FILES} ${INCLUDE_DIR})
endif( )
# include directories
include_directories("./")
include_directories("../mbs_utilities")
include_directories("../mbs_struct")
......@@ -26,14 +26,13 @@ set(INCLUDE_DIR ${INCLUDE_DIR} "./" PARENT_SCOPE)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-unused-result")
if(FLAG_SHARED_LIB)
add_library(MBsysC_module SHARED ${SOURCE_FILES} ${INCLUDE_DIR})
target_link_libraries(MBsysC_module MBsysC_struct MBsysC_numerics MBsysC_utilities MBsysC_realtime ${LIBXML2_LIBRARIES} ${GSL_LIBRARIES})
add_library(MBsysC_module SHARED ${SOURCE_FILES} ${INCLUDE_DIR})
target_link_libraries(MBsysC_module MBsysC_struct MBsysC_numerics MBsysC_utilities MBsysC_realtime ${LIBXML2_LIBRARIES} ${GSL_LIBRARIES})
else( )
add_library(MBsysC_module STATIC ${SOURCE_FILES} ${INCLUDE_DIR})
add_library(MBsysC_module STATIC ${SOURCE_FILES} ${INCLUDE_DIR})
endif( )
# include directories
include_directories(../mbs_struct)
include_directories(../mbs_numerics)
include_directories(../mbs_utilities)
......
......@@ -16,5 +16,6 @@ set(INCLUDE_DIR ${INCLUDE_DIR} "./" PARENT_SCOPE)
add_library(MBsysC_numerics ${SOURCE_FILES} ${INCLUDE_DIR})
# include directories
include_directories(../mbs_struct)
include_directories(../mbs_utilities)
......@@ -13,44 +13,42 @@ increment_src(./realtime)
# Get SDL lib and add plot functions to src
if (FLAG_PLOT)
# Find SDL
sdl_lib(mbs_realtime)
set(SDL2_LIBRARIES ${SDL2_LIBRARIES} PARENT_SCOPE)
set(SDL2TTF_LIBRARIES ${SDL2TTF_LIBRARIES} PARENT_SCOPE)
# Find SDL
sdl_lib(mbs_realtime)
set(SDL2_LIBRARIES ${SDL2_LIBRARIES} PARENT_SCOPE)
set(SDL2TTF_LIBRARIES ${SDL2TTF_LIBRARIES} PARENT_SCOPE)
increment_src(./sdl)
increment_src(./sdl)
# configure a header file to pass some of the CMake settings to the source code
set(SDL_FILES ${CMAKE_CURRENT_SOURCE_DIR}/sdl/SDL_files)
# configure a header file to pass some of the CMake settings to the source code
set(SDL_FILES ${CMAKE_CURRENT_SOURCE_DIR}/sdl/SDL_files)
configure_file (
"./sdl/conf/cmake_sdl_config.h.in"
"${PROJECT_BINARY_DIR}/conf/cmake_sdl_config.h"
)
include_directories ("${PROJECT_BINARY_DIR}/conf")
endif (FLAG_PLOT)
configure_file (
"./sdl/conf/cmake_sdl_config.h.in"
"${PROJECT_BINARY_DIR}/conf/cmake_sdl_config.h"
)
include_directories ("${PROJECT_BINARY_DIR}/conf")
endif ()
# Get java lib and add java functions to src
if (FLAG_VISU)
# find java and java 3d
java_lib(mbs_realtime)
set(JNI_INCLUDE_PATH ${JNI_INCLUDE_PATH} PARENT_SCOPE)
set(JNI_LIBRARIES ${JNI_LIBRARIES} PARENT_SCOPE)
set (J3D_PATH ${J3D_PATH} PARENT_SCOPE)
include_directories("./java")
increment_src(./java)
# find java and java 3d
java_lib(mbs_realtime)
set(JNI_LIBRARIES ${JNI_LIBRARIES} PARENT_SCOPE)
set (J3D_PATH ${J3D_PATH} PARENT_SCOPE)
set(JAR_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../mbsyspad/MBsysPad.jar)
include_directories("./java")
increment_src(./java)
configure_file (
"./java/conf/cmake_java_config.h.in"
"${PROJECT_BINARY_DIR}/conf/cmake_java_config.h"
)
include_directories ("${PROJECT_BINARY_DIR}/conf")
set(JAR_PATH ${CMAKE_CURRENT_SOURCE_DIR}/../../mbsyspad/MBsysPad.jar)
endif (FLAG_VISU)
configure_file (
"./java/conf/cmake_java_config.h.in"
"${PROJECT_BINARY_DIR}/conf/cmake_java_config.h"
)
include_directories ("${PROJECT_BINARY_DIR}/conf")
endif ()
# list include directories (to find headers)
init_include()
......@@ -60,15 +58,15 @@ add_library(MBsysC_realtime ${SOURCE_FILES} ${INCLUDE_DIR})
# SDL external library: linkage
if (FLAG_PLOT)
target_link_libraries (MBsysC_realtime ${SDL2_LIBRARIES} ${SDL2TTF_LIBRARIES})
target_link_libraries (MBsysC_realtime ${SDL2_LIBRARIES} ${SDL2TTF_LIBRARIES})
endif ( )
# Java external library: linkage
if (FLAG_VISU)
target_link_libraries (MBsysC_realtime ${JNI_LIBRARIES})
target_link_libraries (MBsysC_realtime ${JNI_LIBRARIES})
endif ( )
# include directories
include_directories("./")
include_directories("../mbs_struct")
include_directories("../mbs_utilities")
......
......@@ -16,5 +16,6 @@ set(INCLUDE_DIR ${INCLUDE_DIR} "./" PARENT_SCOPE)
add_library(MBsysC_struct ${SOURCE_FILES} ${INCLUDE_DIR})
# include directories
include_directories("../mbs_utilities/")
include_directories("../mbs_numerics/")
......@@ -16,13 +16,13 @@ set(INCLUDE_DIR ${INCLUDE_DIR} "./" PARENT_SCOPE)
set(INCLUDE_DIR ${INCLUDE_DIR} "./auto_output" PARENT_SCOPE)
if(FLAG_SHARED_LIB)
add_library(MBsysC_utilities SHARED ${SOURCE_FILES} ${INCLUDE_DIR})
target_link_libraries(MBsysC_struct)
else(FLAG_SHARED_LIB)
add_library(MBsysC_utilities STATIC ${SOURCE_FILES} ${INCLUDE_DIR})
endif(FLAG_SHARED_LIB)
add_library(MBsysC_utilities SHARED ${SOURCE_FILES} ${INCLUDE_DIR})
target_link_libraries(MBsysC_struct)
else( )
add_library(MBsysC_utilities STATIC ${SOURCE_FILES} ${INCLUDE_DIR})
endif( )
# include directories
include_directories("./")
include_directories("./auto_output")
include_directories(../mbs_struct)
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment