diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 000000000..6e5c5a33f --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,14 @@ +cmake_minimum_required(VERSION 3.2) +project(infinigen) + +set(CONDA_DIR $ENV{CONDA_PREFIX}) +find_program(Python_EXECUTABLE python PATHS ${CONDA_DIR} ~/desktop/.conda NO_DEFAULT_PATH) +if(NOT Python_EXECUTABLE) + message(FATAL_ERROR "Python executable not found in conda environment") +endif() +message(STATUS "Python executable found at ${Python_EXECUTABLE}") +get_filename_component(CONDA_ROOT ${Python_EXECUTABLE} DIRECTORY) +set(CONDA_INDICATOR_DIRECTORY ${CONDA_ROOT}/Library/include) + +add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/worldgen) +add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/worldgen/terrain) \ No newline at end of file diff --git a/win.patch b/win.patch new file mode 100644 index 000000000..4398ea080 --- /dev/null +++ b/win.patch @@ -0,0 +1,338 @@ +From a7742455b2341b0603a431eca0200827eacb51d6 Mon Sep 17 00:00:00 2001 +From: XingShuo <928160430@qq.com> +Date: Fri, 28 Jul 2023 14:23:16 +0800 +Subject: [PATCH] patch1 + +--- + worldgen/terrain/assets/landtiles/core.py | 2 +- + worldgen/terrain/source/cpu/elements/atmosphere.cpp | 2 +- + worldgen/terrain/source/cpu/elements/ground.cpp | 2 +- + worldgen/terrain/source/cpu/elements/landtiles.cpp | 2 +- + worldgen/terrain/source/cpu/elements/mountains.cpp | 2 +- + .../terrain/source/cpu/elements/upsidedown_mountains.cpp | 2 +- + worldgen/terrain/source/cpu/elements/voronoi_rocks.cpp | 2 +- + worldgen/terrain/source/cpu/elements/warped_rocks.cpp | 2 +- + worldgen/terrain/source/cpu/elements/waterbody.cpp | 2 +- + worldgen/terrain/source/cpu/meshing/visibility_test.cpp | 2 +- + worldgen/terrain/source/cpu/surfaces/chunkyrock.cpp | 2 +- + worldgen/terrain/source/cpu/surfaces/cobble_stone.cpp | 2 +- + worldgen/terrain/source/cpu/surfaces/cracked_ground.cpp | 2 +- + worldgen/terrain/source/cpu/surfaces/dirt.cpp | 2 +- + worldgen/terrain/source/cpu/surfaces/ice.cpp | 2 +- + worldgen/terrain/source/cpu/surfaces/mountain.cpp | 2 +- + worldgen/terrain/source/cpu/surfaces/mud.cpp | 2 +- + worldgen/terrain/source/cpu/surfaces/sand.cpp | 2 +- + worldgen/terrain/source/cpu/surfaces/sandstone.cpp | 2 +- + worldgen/terrain/source/cpu/surfaces/snow.cpp | 2 +- + worldgen/terrain/source/cpu/surfaces/soil.cpp | 2 +- + worldgen/terrain/source/cpu/surfaces/stone.cpp | 2 +- + worldgen/terrain/utils/ctype_util.py | 8 +++++++- + 23 files changed, 29 insertions(+), 23 deletions(-) + +diff --git a/worldgen/terrain/assets/landtiles/core.py b/worldgen/terrain/assets/landtiles/core.py +index aa2d075..5360b30 100644 +--- a/worldgen/terrain/assets/landtiles/core.py ++++ b/worldgen/terrain/assets/landtiles/core.py +@@ -83,7 +83,7 @@ def assets_to_data( + N=2048, + do_smooth=False, + ): +- preset_name = str(folder).split("/")[-2] ++ preset_name = str(folder).replace("\\", "/").split("/")[-2] + data = {} + if land_process is None: path = folder/f"{AssetFile.Heightmap}.exr" + elif land_process == Process.Snowfall: path = folder/f"{Process.Snowfall}.{AssetFile.Heightmap}.exr" +diff --git a/worldgen/terrain/source/cpu/elements/atmosphere.cpp b/worldgen/terrain/source/cpu/elements/atmosphere.cpp +index b78308d..1a26cb7 100644 +--- a/worldgen/terrain/source/cpu/elements/atmosphere.cpp ++++ b/worldgen/terrain/source/cpu/elements/atmosphere.cpp +@@ -15,7 +15,7 @@ extern "C" { + ) { + using namespace data; + #pragma omp parallel for +- for (size_t idx = 0; idx < size; idx++) { ++ for (int idx = 0; idx < size; idx++) { + atmosphere( + positions[idx], sdfs + idx, meta_param, + d_i_params, d_f_params, second_d_i_params, second_d_f_params +diff --git a/worldgen/terrain/source/cpu/elements/ground.cpp b/worldgen/terrain/source/cpu/elements/ground.cpp +index 8744d5c..78f2c95 100644 +--- a/worldgen/terrain/source/cpu/elements/ground.cpp ++++ b/worldgen/terrain/source/cpu/elements/ground.cpp +@@ -19,7 +19,7 @@ extern "C" { + int n_auxiliaries = 1; + if (auxs == NULL) n_auxiliaries = 0; + #pragma omp parallel for +- for (size_t idx = 0; idx < size; idx++) { ++ for (int idx = 0; idx < size; idx++) { + ground( + positions[idx], sdfs + idx, auxs + n_auxiliaries * idx, meta_param, + d_i_params, d_f_params, second_d_i_params, second_d_f_params +diff --git a/worldgen/terrain/source/cpu/elements/landtiles.cpp b/worldgen/terrain/source/cpu/elements/landtiles.cpp +index 09c15cd..c6bead5 100644 +--- a/worldgen/terrain/source/cpu/elements/landtiles.cpp ++++ b/worldgen/terrain/source/cpu/elements/landtiles.cpp +@@ -19,7 +19,7 @@ extern "C" { + int n_auxiliaries = 3; + if (auxs == NULL) n_auxiliaries = 0; + #pragma omp parallel for +- for (size_t idx = 0; idx < size; idx++) { ++ for (int idx = 0; idx < size; idx++) { + landtiles( + positions[idx], sdfs + idx, auxs + n_auxiliaries * idx, meta_param, + d_i_params, d_f_params, second_d_i_params, second_d_f_params +diff --git a/worldgen/terrain/source/cpu/elements/mountains.cpp b/worldgen/terrain/source/cpu/elements/mountains.cpp +index f5156f7..6e0cf23 100644 +--- a/worldgen/terrain/source/cpu/elements/mountains.cpp ++++ b/worldgen/terrain/source/cpu/elements/mountains.cpp +@@ -16,7 +16,7 @@ extern "C" { + ) { + using namespace data; + #pragma omp parallel for +- for (size_t idx = 0; idx < size; idx++) { ++ for (int idx = 0; idx < size; idx++) { + mountains(positions[idx], sdfs + idx, d_i_params, d_f_params); + } + } +diff --git a/worldgen/terrain/source/cpu/elements/upsidedown_mountains.cpp b/worldgen/terrain/source/cpu/elements/upsidedown_mountains.cpp +index 3cade49..71fe855 100644 +--- a/worldgen/terrain/source/cpu/elements/upsidedown_mountains.cpp ++++ b/worldgen/terrain/source/cpu/elements/upsidedown_mountains.cpp +@@ -18,7 +18,7 @@ extern "C" { + int n_auxiliaries = 1; + if (auxs == NULL) n_auxiliaries = 0; + #pragma omp parallel for +- for (size_t idx = 0; idx < size; idx++) { ++ for (int idx = 0; idx < size; idx++) { + upsidedown_mountains(positions[idx], sdfs + idx, auxs + n_auxiliaries * idx, d_i_params, d_f_params); + } + } +diff --git a/worldgen/terrain/source/cpu/elements/voronoi_rocks.cpp b/worldgen/terrain/source/cpu/elements/voronoi_rocks.cpp +index a8ab822..f3d2d1b 100644 +--- a/worldgen/terrain/source/cpu/elements/voronoi_rocks.cpp ++++ b/worldgen/terrain/source/cpu/elements/voronoi_rocks.cpp +@@ -18,7 +18,7 @@ extern "C" { + int n_auxiliaries = 2; + if (auxs == NULL) n_auxiliaries = 0; + #pragma omp parallel for +- for (size_t idx = 0; idx < size; idx++) { ++ for (int idx = 0; idx < size; idx++) { + voronoi_rocks( + positions[idx], sdfs + idx, auxs + n_auxiliaries * idx, meta_param, second_meta_param, + d_i_params, d_f_params, second_d_i_params, second_d_f_params, third_d_i_params, third_d_f_params +diff --git a/worldgen/terrain/source/cpu/elements/warped_rocks.cpp b/worldgen/terrain/source/cpu/elements/warped_rocks.cpp +index 11d2936..0efd6b6 100644 +--- a/worldgen/terrain/source/cpu/elements/warped_rocks.cpp ++++ b/worldgen/terrain/source/cpu/elements/warped_rocks.cpp +@@ -19,7 +19,7 @@ extern "C" { + int n_auxiliaries = 1; + if (auxs == NULL) n_auxiliaries = 0; + #pragma omp parallel for +- for (size_t idx = 0; idx < size; idx++) { ++ for (int idx = 0; idx < size; idx++) { + warped_rocks( + positions[idx], sdfs + idx, auxs + n_auxiliaries * idx, meta_param, + d_i_params, d_f_params, second_d_i_params, second_d_f_params +diff --git a/worldgen/terrain/source/cpu/elements/waterbody.cpp b/worldgen/terrain/source/cpu/elements/waterbody.cpp +index 9733931..08a9c9e 100644 +--- a/worldgen/terrain/source/cpu/elements/waterbody.cpp ++++ b/worldgen/terrain/source/cpu/elements/waterbody.cpp +@@ -17,7 +17,7 @@ extern "C" { + int n_auxiliaries = 1; + if (auxs == NULL) n_auxiliaries = 0; + #pragma omp parallel for +- for (size_t idx = 0; idx < size; idx++) { ++ for (int idx = 0; idx < size; idx++) { + waterbody( + positions[idx], sdfs + idx, auxs + n_auxiliaries * idx, meta_param, second_meta_param, + d_i_params, d_f_params, second_d_i_params, second_d_f_params, third_d_i_params, third_d_f_params +diff --git a/worldgen/terrain/source/cpu/meshing/visibility_test.cpp b/worldgen/terrain/source/cpu/meshing/visibility_test.cpp +index 5aae9c1..3146413 100644 +--- a/worldgen/terrain/source/cpu/meshing/visibility_test.cpp ++++ b/worldgen/terrain/source/cpu/meshing/visibility_test.cpp +@@ -488,7 +488,7 @@ void convex_hull_cutting_update() { + bool aligned_flag = 1; + for (int iv = 0; iv < 3; iv++) + aligned_flag &= aligned[iv * 2] || aligned[iv * 2 + 1]; +- if (not aligned_flag) { ++ if (! aligned_flag) { + mesh::visibility[f] = 1; + continue; + } +diff --git a/worldgen/terrain/source/cpu/surfaces/chunkyrock.cpp b/worldgen/terrain/source/cpu/surfaces/chunkyrock.cpp +index 4dba551..8c826bb 100644 +--- a/worldgen/terrain/source/cpu/surfaces/chunkyrock.cpp ++++ b/worldgen/terrain/source/cpu/surfaces/chunkyrock.cpp +@@ -19,7 +19,7 @@ extern "C" { + float3_nonbuiltin *offsets + ) { + #pragma omp parallel for +- for (size_t idx = 0; idx < size; idx++) { ++ for (int idx = 0; idx < size; idx++) { + geo_rocks( + positions[idx], normals[idx], f_params, f3_params, f4_params, + offsets + idx +diff --git a/worldgen/terrain/source/cpu/surfaces/cobble_stone.cpp b/worldgen/terrain/source/cpu/surfaces/cobble_stone.cpp +index 080f05a..2d50335 100644 +--- a/worldgen/terrain/source/cpu/surfaces/cobble_stone.cpp ++++ b/worldgen/terrain/source/cpu/surfaces/cobble_stone.cpp +@@ -18,7 +18,7 @@ extern "C" { + float3_nonbuiltin *offsets + ) { + #pragma omp parallel for +- for (size_t idx = 0; idx < size; idx++) { ++ for (int idx = 0; idx < size; idx++) { + geo_cobblestone( + positions[idx], normals[idx], f_params, f4_params, + offsets + idx +diff --git a/worldgen/terrain/source/cpu/surfaces/cracked_ground.cpp b/worldgen/terrain/source/cpu/surfaces/cracked_ground.cpp +index e3d5e84..37f47ac 100644 +--- a/worldgen/terrain/source/cpu/surfaces/cracked_ground.cpp ++++ b/worldgen/terrain/source/cpu/surfaces/cracked_ground.cpp +@@ -17,7 +17,7 @@ extern "C" { + float3_nonbuiltin *offsets + ) { + #pragma omp parallel for +- for (size_t idx = 0; idx < size; idx++) { ++ for (int idx = 0; idx < size; idx++) { + geo_cracked_ground( + positions[idx], normals[idx], f_params, + offsets + idx +diff --git a/worldgen/terrain/source/cpu/surfaces/dirt.cpp b/worldgen/terrain/source/cpu/surfaces/dirt.cpp +index 26407f8..95ba218 100644 +--- a/worldgen/terrain/source/cpu/surfaces/dirt.cpp ++++ b/worldgen/terrain/source/cpu/surfaces/dirt.cpp +@@ -18,7 +18,7 @@ extern "C" { + float3_nonbuiltin *offsets + ) { + #pragma omp parallel for +- for (size_t idx = 0; idx < size; idx++) { ++ for (int idx = 0; idx < size; idx++) { + geo_dirt( + positions[idx], normals[idx], f_params, f3_params, + offsets + idx +diff --git a/worldgen/terrain/source/cpu/surfaces/ice.cpp b/worldgen/terrain/source/cpu/surfaces/ice.cpp +index 85fd111..4f3e526 100644 +--- a/worldgen/terrain/source/cpu/surfaces/ice.cpp ++++ b/worldgen/terrain/source/cpu/surfaces/ice.cpp +@@ -17,7 +17,7 @@ extern "C" { + float3_nonbuiltin *offsets + ) { + #pragma omp parallel for +- for (size_t idx = 0; idx < size; idx++) { ++ for (int idx = 0; idx < size; idx++) { + geo_ice( + positions[idx], normals[idx], f_params, + offsets + idx +diff --git a/worldgen/terrain/source/cpu/surfaces/mountain.cpp b/worldgen/terrain/source/cpu/surfaces/mountain.cpp +index f70040a..ecebbb0 100644 +--- a/worldgen/terrain/source/cpu/surfaces/mountain.cpp ++++ b/worldgen/terrain/source/cpu/surfaces/mountain.cpp +@@ -18,7 +18,7 @@ extern "C" { + float3_nonbuiltin *offsets + ) { + #pragma omp parallel for +- for (size_t idx = 0; idx < size; idx++) { ++ for (int idx = 0; idx < size; idx++) { + geo_MOUNTAIN( + positions[idx], normals[idx], f_params, f3_params, + offsets + idx +diff --git a/worldgen/terrain/source/cpu/surfaces/mud.cpp b/worldgen/terrain/source/cpu/surfaces/mud.cpp +index c40ba47..acdf0f6 100644 +--- a/worldgen/terrain/source/cpu/surfaces/mud.cpp ++++ b/worldgen/terrain/source/cpu/surfaces/mud.cpp +@@ -17,7 +17,7 @@ extern "C" { + float3_nonbuiltin *offsets + ) { + #pragma omp parallel for +- for (size_t idx = 0; idx < size; idx++) { ++ for (int idx = 0; idx < size; idx++) { + geo_mud( + positions[idx], normals[idx], f_params, + offsets + idx +diff --git a/worldgen/terrain/source/cpu/surfaces/sand.cpp b/worldgen/terrain/source/cpu/surfaces/sand.cpp +index 50ba327..3d447cd 100644 +--- a/worldgen/terrain/source/cpu/surfaces/sand.cpp ++++ b/worldgen/terrain/source/cpu/surfaces/sand.cpp +@@ -18,7 +18,7 @@ extern "C" { + float3_nonbuiltin *offsets + ) { + #pragma omp parallel for +- for (size_t idx = 0; idx < size; idx++) { ++ for (int idx = 0; idx < size; idx++) { + geo_SAND( + positions[idx], normals[idx], f_params, f3_params, + offsets + idx +diff --git a/worldgen/terrain/source/cpu/surfaces/sandstone.cpp b/worldgen/terrain/source/cpu/surfaces/sandstone.cpp +index 78d3ed4..9221ed8 100644 +--- a/worldgen/terrain/source/cpu/surfaces/sandstone.cpp ++++ b/worldgen/terrain/source/cpu/surfaces/sandstone.cpp +@@ -18,7 +18,7 @@ extern "C" { + float3_nonbuiltin *offsets + ) { + #pragma omp parallel for +- for (size_t idx = 0; idx < size; idx++) { ++ for (int idx = 0; idx < size; idx++) { + geometry_sandstone( + positions[idx], normals[idx], f_params, f3_params, + offsets + idx +diff --git a/worldgen/terrain/source/cpu/surfaces/snow.cpp b/worldgen/terrain/source/cpu/surfaces/snow.cpp +index 6b69dee..5ae5e76 100644 +--- a/worldgen/terrain/source/cpu/surfaces/snow.cpp ++++ b/worldgen/terrain/source/cpu/surfaces/snow.cpp +@@ -16,7 +16,7 @@ extern "C" { + float3_nonbuiltin *offsets + ) { + #pragma omp parallel for +- for (size_t idx = 0; idx < size; idx++) { ++ for (int idx = 0; idx < size; idx++) { + geo_snowtexture( + positions[idx], normals[idx], + offsets + idx +diff --git a/worldgen/terrain/source/cpu/surfaces/soil.cpp b/worldgen/terrain/source/cpu/surfaces/soil.cpp +index d16b842..703dfae 100644 +--- a/worldgen/terrain/source/cpu/surfaces/soil.cpp ++++ b/worldgen/terrain/source/cpu/surfaces/soil.cpp +@@ -18,7 +18,7 @@ extern "C" { + float3_nonbuiltin *offsets + ) { + #pragma omp parallel for +- for (size_t idx = 0; idx < size; idx++) { ++ for (int idx = 0; idx < size; idx++) { + geometry_soil( + positions[idx], normals[idx], f_params, f4_params, + offsets + idx +diff --git a/worldgen/terrain/source/cpu/surfaces/stone.cpp b/worldgen/terrain/source/cpu/surfaces/stone.cpp +index 7542680..817478f 100644 +--- a/worldgen/terrain/source/cpu/surfaces/stone.cpp ++++ b/worldgen/terrain/source/cpu/surfaces/stone.cpp +@@ -19,7 +19,7 @@ extern "C" { + float3_nonbuiltin *offsets + ) { + #pragma omp parallel for +- for (size_t idx = 0; idx < size; idx++) { ++ for (int idx = 0; idx < size; idx++) { + geo_stone( + positions[idx], normals[idx], f_params, f3_params, f4_params, + offsets + idx +diff --git a/worldgen/terrain/utils/ctype_util.py b/worldgen/terrain/utils/ctype_util.py +index 71862a7..009e68c 100644 +--- a/worldgen/terrain/utils/ctype_util.py ++++ b/worldgen/terrain/utils/ctype_util.py +@@ -25,4 +25,10 @@ def register_func(me, dll, name, argtypes=[], restype=None, caller_name=None): + func.restype = restype + + def load_cdll(path): +- return CDLL(Path(sys.path[-1]) / path, mode=RTLD_LOCAL) +\ No newline at end of file ++ if sys.platform == 'win32': ++ #replace suffix .so to .dll ++ path = Path(path) ++ path = path.with_suffix('.dll') ++ ++ _path:Path = Path(sys.path[-1]) / path ++ return CDLL(_path.as_posix(), mode=RTLD_LOCAL) +\ No newline at end of file +-- +2.34.1.windows.1 + diff --git a/worldgen/CMakeLists.txt b/worldgen/CMakeLists.txt new file mode 100644 index 000000000..b775dc585 --- /dev/null +++ b/worldgen/CMakeLists.txt @@ -0,0 +1,8 @@ +cmake_minimum_required(VERSION 3.2) +project(worldgen) + +add_custom_target(worldgen_python_ext + COMMAND ${Python_EXECUTABLE} setup_linux.py build_ext --inplace + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/assets/creatures/geometry/cpp_utils + COMMENT "Building Python extension NURBSE" +) \ No newline at end of file diff --git a/worldgen/terrain/CMakeLists.txt b/worldgen/terrain/CMakeLists.txt new file mode 100644 index 000000000..6022531f0 --- /dev/null +++ b/worldgen/terrain/CMakeLists.txt @@ -0,0 +1,97 @@ +cmake_minimum_required(VERSION 3.2) +project(terrain) + +enable_language(CXX) +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_POSITION_INDEPENDENT_CODE ON) +set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") + +add_compile_definitions(M_PI 3.14159265358979323846) +add_compile_definitions(M_PI_2 1.57079632679489661923) + + +find_package(OpenMP REQUIRED) + +set(DESTINATION ${CMAKE_CURRENT_SOURCE_DIR}/lib) + + +set(elements + "voronoi_rocks" + "upsidedown_mountains" + "ground" + "warped_rocks" + "mountains" + "landtiles" + "atmosphere" + "waterbody" +) + +set(surfaces + "chunkyrock" + "cobble_stone" + "cracked_ground" + "dirt" + "ice" + "mountain" + "mud" + "sand" + "sandstone" + "snow" + "soil" + "stone" +) + + +# cuda part +if(USE_CUDA) + enable_language(CUDA) + find_package(CUDA REQUIRED) + set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -Xcompiler") + cuda_add_library(FastNoiseLite SHARED source/cuda/utils/FastNoiseLite.cu) + install(TARGETS FastNoiseLite DESTINATION ${DESTINATION}/cuda/utils) + foreach(element ${elements}) + cuda_add_library(${element} SHARED source/cuda/elements/${element}.cu) + install(TARGETS ${element} DESTINATION ${DESTINATION}/cuda/elements) + endforeach() + foreach(surface ${surfaces}) + cuda_add_library(${surface} SHARED source/cuda/surfaces/${surface}.cu) + install(TARGETS ${surface} DESTINATION ${DESTINATION}/cuda/surfaces) + endforeach() +endif() + +# cpu part +if(WIN32) + foreach(element ${elements}) + add_library(${element} SHARED source/cpu/elements/${element}.cpp) + target_link_libraries(${element} PRIVATE OpenMP::OpenMP_CXX) + install(TARGETS ${element} DESTINATION ${DESTINATION}/cpu/elements) + endforeach() + foreach(surface ${surfaces}) + add_library(${surface} SHARED source/cpu/surfaces/${surface}.cpp) + target_link_libraries(${surface} PRIVATE OpenMP::OpenMP_CXX) + install(TARGETS ${surface} DESTINATION ${DESTINATION}/cpu/surfaces) + endforeach() + add_library(FastNoiseLite SHARED source/cpu/utils/FastNoiseLite.cpp) + target_link_libraries(FastNoiseLite PRIVATE OpenMP::OpenMP_CXX) + install(TARGETS FastNoiseLite DESTINATION ${DESTINATION}/cpu/utils) +endif() + +file(GLOB_RECURSE MESHING_SOURCES source/cpu/meshing/*.cpp) +foreach(meshing_source ${MESHING_SOURCES}) + get_filename_component(meshing_name ${meshing_source} NAME_WE) + add_library(${meshing_name} SHARED ${meshing_source}) + target_link_libraries(${meshing_name} PRIVATE OpenMP::OpenMP_CXX) + install(TARGETS ${meshing_name} DESTINATION ${DESTINATION}/cpu/meshing) +endforeach() + +add_library(SoilMachine SHARED source/cpu/soil_machine/SoilMachine.cpp) +target_include_directories(SoilMachine PRIVATE ${CONDA_INDICATOR_DIRECTORY}) +target_link_libraries(SoilMachine PRIVATE OpenMP::OpenMP_CXX) +install(TARGETS SoilMachine DESTINATION ${DESTINATION}/cpu/SoilMachine) + +add_custom_target(terrin_python_ext + COMMAND ${Python_EXECUTABLE} setup.py build_ext --inplace + WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} + COMMENT "Building python extension" +) \ No newline at end of file