2012-10-09 2 views
0

나는변경 cmake 디렉토리

project/ (root) 
    libraries/ (contains (precompiled) libraries 
    src/ 
    code/ (contains a set of fortran files) 

내 CMakeLists.txt 파일이 project/ 현재 다음과 같은 구조를 가지고 프로젝트에 대한 cmake 파일을 작성하고 효과적으로 단지이 (가) 작성하는

cmake_minimum_required(VERSION 2.6) 

enable_language(Fortran) 
project(project1) 

set(projsrc src/code) 

set(libdir lib/) 

find_library(PROJ_LIBRARY pr10 PATHS ${libdir}) 

add_executable (sc1 sc1.f90) 
target_link_libraries(sc1 ${PROJ_LIBRARY}) 

입니다 해요 내 바이너리를 소스 코드와 같은 폴더에 넣었을 때 실제로 위의 단계 (예 : src 폴더 -이 구조가 바뀌어 결국 bin 폴더가됩니다.)에서 수행 할 수 있지만 수행 방법을 찾지 못했습니다. 그것.

몇 가지 대답은 모든 폴더에 CMakeLists.txt 파일이 있어야한다는 것입니다. 맞습니까? 환경 변수를 설정하거나 CMake 변수를 사용할 수 있습니까 (예 :). 또한 일부 답변에서는 게시 된 솔루션이 C++과 다른지 여부가 명확하지 않습니다. CMake가 가장 자주 사용되는 것으로 보입니다. 내 행동이 다른 이유

cmake_minimum_required(VERSION 2.6) 
enable_language(Fortran) 
project(project1) 

set(projsrc src/code) 

set(libdir lib/) 

find_library(PROJ_LIBRARY pr10 PATHS ${libdir}) 

add_executable (src/sc1 ${projsrc}/sc1.f90) 
target_link_libraries(src/sc1 ${PROJ_LIBRARY}) 

그러나,이 을 설명하지 않습니다

편집

나는 내가 약간 수정하여 원하는 동작으로 변경할 수 있다는 것을 발견 아래의 화살표 도저에 따라 어떻게되어야하는지에 대해 또한 환경 변수의 값을 표시하는 방법을 알아 내려고 노력하고 있습니다. 나는 행운을 빌어 다음을 시도했다.

message(${RUNTIME_OUTPUT_DIRECTORY}) 
message($ENV{RUNTIME_OUTPUT_DIRECTORY}) 
message(${CMAKE_RUNTIME_OUTPUT_DIRECTORY}) 
message($ENV{CMAKE_RUNTIME_OUTPUT_DIRECTORY}) 
+1

"bin"dir 아이디어에주의하십시오. 좋은 이유로 현대 건축 양식이 아닙니다. "out-of-source builds"가 필요할 수도 있습니다. http://stackoverflow.com/a/12237398/587407 – Offirmo

+0

@Offirmo - 음, 모든 과학 용 소프트웨어에는'src'와' bin 디렉토리 구조 -이 아이디어에 무슨 문제가 있습니까? 더 이상 읽어 주실 수 있습니까? – ChrisW

+2

예를 들어, 다른 컴파일러 (동일한 작업) 또는 다른 옵션 (동일한 작업)을 사용하여 동일한 프로그램을 빌드하려는 경우 bin 디렉토리에서 어떻게 공존시킬 수 있습니까? 전체 구조를 복제해야합니다. "out-of-source"빌드를 사용하면 같은 소스를 공유하는 "bin"디렉토리를 원하는만큼 가질 수 있습니다. cmake는 그것을 옹호합니다 : http://www.cmake.org/Wiki/CMake_FAQ#Out-of-source_build_trees 그리고 예를 들어, Wt 라이브러리는 http : //www.webtoolkit과 같은 것을 만듭니다.eu/wt/doc/reference/html/InstallationUnix.html # build. – Offirmo

답변

0

기본적으로 바이너리는 빌드 디렉토리의 각각의 서브 디렉토리에 나타날 것이다. 각각 나는 CMakeLists.txtadd_executable() 전화를 포함하는 디렉토리를 의미합니다. 예를 들어

, 루트 폴더에 CMakeLists.txt

add_executable(tgt1 src1.f90) 
add_executable(tgt2 subdir/src2.f90) 

를 다음과 같은 경우, 당신은 ${CMAKE_BINARY_DIR} 모두 바이너리를 얻을 것이다. 따라서 tgt2${CMAKE_BINARY_DIR}/subdir 일 경우 CMakeLists.txt를 거기에 추가하고 거기에서 add_executable(tgt2 src2.f90)을 호출해야합니다.

이 동작을 변경할 수 있습니다

CMAKE_LIBRARY_OUTPUT_DIRECTORY, CMAKE_RUNTIME_OUTPUT_DIRECTORY 등을.

respective target properties으로 설정할 수도 있습니다.

+0

힌트를 보내 주셔서 감사합니다. (CMakeLists.txt는'root /'에 있고, 바이너리는'root/src/code'에 생성됩니다) 2 레벨 아래에 바이너리가 생성됩니다. - 내가 오해 한게있어? 또한,'CMAKE_RUNTIME_OUTPUT_DIRECTORY'가 현재 무엇으로 설정되어 있는지 어떻게 알 수 있습니까? 나는 문서에서 그것을 찾을 수 없었다 – ChrisW

+0

흠, 이상한. 그것은 포트란 특유의 것일 수 있습니다. 실제'CMakeLists.txt'를 게시 할 수 있습니까? – arrowd

+0

좀 더 자세한 정보로 내 질문을 업데이트했습니다. – ChrisW